Twig 拡張機能に slugify メソッドがあり、場合によってはコントローラーで使用したいと思います。
これには簡単な方法がありますか?
コントローラーの Twig Extensions から関数にアクセスするにはどうすればよいですか?
または、コードと小枝で使用するために、slugify メソッドをヘルパーとして作成する必要がありますか?
これには2つの解決策があると思いますが、どちらもTwig_Function_Method
クラスを使用する必要があります。
すでに投稿されている最初の解決策gilden
は、ロジックをサービスにカプセル化し、Twig 拡張機能のラッパーを作成することです。
もう 1 つの解決策は、Twig 拡張機能のみを使用することです。Twig Extensino はすでにサービスであるため、特別な を使用してサービスとして定義する必要があります<tag name="twig.extension" />
。しかし、これはサービスでもあり、サービス コンテナーによって取得できるインスタンスです。また、他のサービスを注入することもできます。
これで、Twig 拡張機能 / サービスができました。
class MyTwigExtension extends \Twig_Extension
{
private $anotherService;
public function __construct(SecurityService $anotherService= null)
{
$this->anotherService = $anotherService;
}
public function foo($param)
{
// do something
$this->anotherService->bar($param);
}
public function getFunctions()
{
// function names in twig => function name in this calss
return array(
'foo' => new \Twig_Function_Method($this, 'foo'),
);
}
/**
* Returns the name of the extension.
*
* @return string The extension name
*/
public function getName()
{
return 'my_extension';
}
}
services.xml は次のようになります。
<service id="acme.my_extension" class="Acme\CoreBundle\Twig\Extension\MyTwigExtension">
<tag name="twig.extension" />
<argument type="service" id="another.service"></argument>
</service>
コントローラーからサービスにアクセスするには、これを使用するだけです。
$this->container->get('acme.my_extension')
通常のサービスとの唯一の違いは、 twig拡張機能が遅延ロードされないことです ( http://symfony.com/doc/current/cookbook/templating/twig_extension.html#register-an-extension-as-a-service )
一般的なサービスを作成し、それをTwig拡張機能に注入することをお勧めします。拡張機能は、サービスのラッパーとして機能します。
namespace Acme\Bundle\DemoBundle\...;
class MyService
{
public function myFunc($foo, $bar)
{
// some code...
}
// additional methods...
}
編集-Squazicが述べたように、最初の引数はを実装する必要がありますTwig_ExtensionInterface
。エレガントでない解決策は、にメソッドを追加することMyTwigExtension
です。これにより、サービス内のそれぞれのメソッドが呼び出されます。
namespace Acme\Bundle\DemoBundle\Twig\Extension;
class MyTwigExtension extends \Twig_Extension
{
protected $service;
public function __construct(MyService $service)
{
$this->service = $service;
}
public function getFunctions()
{
return array(
'myTwigFunction' => new \Twig_Function_Method($this, 'myFunc'),
'mySecondFunc' => new \Twig_Function_Method($this, 'mySecondFunc'),
);
}
public function myFunc($foo, $bar)
{
return $this->service->myFunc($foo, $bar);
}
// etc...
}