15

Twig 拡張機能に slugify メソッドがあり、場合によってはコントローラーで使用したいと思います。
これには簡単な方法がありますか?
コントローラーの Twig Extensions から関数にアクセスするにはどうすればよいですか?

または、コードと小枝で使用するために、slugify メソッドをヘルパーとして作成する必要がありますか?

4

4 に答える 4

8

小枝とコントローラーから関数/ロジックにアクセスする

これには2つの解決策があると思いますが、どちらもTwig_Function_Methodクラスを使用する必要があります。

1

すでに投稿されている最初の解決策gildenは、ロジックをサービスにカプセル化し、Twig 拡張機能のラッパーを作成することです。

2

もう 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 )

于 2013-04-12T12:46:40.433 に答える
7

一般的なサービスを作成し、それを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...

}
于 2012-07-11T11:30:34.837 に答える