Template オブジェクトにカスタムの Helpers オブジェクトを提供することができます。このカスタム Helpers オブジェクトに、好きなヘルパーメソッドを追加できます。あなたのヘルパーメソッドは、その Template インスタンスによって処理されるテンプレートファイル内で利用可能になります。
最も簡単な方法は、HtmlHelpers を拡張して新しいクラスにメソッドを追加することです。
例えば、以下のカスタム Helpers クラスは、文字列をROT-13で暗号化し、適切にエスケープするメソッドを追加しています:
<?php
namespace Project\Template\Helper;
use Qiq\Helper\Html\HtmlHelpers;
class CustomHelpers extends HtmlHelpers
{
public function rot13(string $str) : string
{
return $this->h(str_rot13($str));
}
}
あるいは、ベースの Helpers オブジェクトを拡張し、HtmlHelperMethods トレイトを使用することもできます:
<?php
namespace Project\Template\Helper;
use Qiq\Helper\Html\HtmlHelperMethods;
use Qiq\Helpers;
class CustomHelpers extends Helpers
{
use HtmlHelperMethods;
public function rot13(string $str) : string
{
return $this->h(str_rot13($str));
}
}
最後に、HTMLを全く使用しない場合は、単に Helpers クラスを拡張するだけで構いません。
<?php
namespace Project\Template\Helper;
use Qiq\Helpers;
class CustomHelpers extends Helpers
{
public function rot13(string $str) : string
{
return str_rot13($str);
}
}
カスタム Helpers クラスを作成したら、そのインスタンスを使用して Template を作成します:
use Project\Template\Helper\CustomHelpers;
use Qiq\Template;
$template = Template::new(
paths: ...,
helpers: new CustomHelpers(),
);
これで、テンプレートファイル内でカスタムヘルパーメソッドを使用できます。
プレーンなPHPで使用する場合 ...
<?= $this->rot13('Uryyb Jbeyq!'); ?>
... もしくは、Qiq構文で使用する場合:
{{= rot13 ('Uryyb Jbeyq!') }}
どちらの方法でも、出力は "Hello World!" となります。
必要に応じて、ヘルパーのロジックをクラスに配置し、オートワイヤリングされる Qiq\Container(後述)からそのクラスのインスタンスを $this->get()
を使用して取得することができます。
例えば、ROT-13のロジックをクラスに配置した場合...
<?php
namespace Project\Template\Helper;
use Qiq\Helper\Html\Escape;
class Rot13
{
public function __construct(protected Escape $escape)
{
}
public function __invoke(string $str): string
{
return $this->escape->h(str_rot13($str));
}
}
... このようにして、カスタム Helpers オブジェクト内からそのクラスのインスタンスを get()
で取得し、好きなように使用できます
<?php
namespace Project\Template\Helper;
use Project\Template\Helper\Rot13;
use Qiq\Helper\Html\HtmlHelpers;
class CustomHelpers extends HelperHelpers
{
public function rot13(string $str) : string
{
return $this->get(Rot13::class)->__invoke($str);
}
}
Helpers クラスはオートワイヤリングされる Qiq\Container オブジェクトを使用します。カスタムヘルパーメソッド内で、$this->get()
を使用して Qiq\Container からオブジェクトを取得できます。
Qiq\Container を設定するには、クラスコンストラクタのパラメータ名と値の配列を使用してインスタンス化し、それを使用して Helpers を作成します。例えば、Escape のエンコーディングを UTF-8 以外に変更する場合:
use Project\Template\Helper\CustomHelpers;
use Qiq\Container;
use Qiq\Helper\Html\Escape;
use Qiq\Template;
$container = new Container([
Escape::class => [
'encoding' => 'EUC-JP'
],
]);
$template = Template::new(
paths: ...,
helpers: new CustomHelpers($container)
);
Qiq\Container は比較的低機能です。必要に応じて、Qiq\Container を任意の PSR-11 ContainerInterface インスタンスに置き換えることができます
use Project\Template\Helper\CustomHelpers;
use Project\Psr11Container;
use Qiq\Template;
$psr11container = new Psr11Container();
$template = Template::new(
paths: ...,
helpers: new CustomHelpers($psr11container)
);