22

Twig ExtensionRequest内のオブジェクトにアクセスするにはどうすればよいですか?

namespace Acme\Bundle\Twig;

use Twig_SimpleFunction;

class MyClass extends \Twig_Extension
{
    public function getFunctions()
    {
        return array(
            new Twig_SimpleFunction('xyz', function($param) {

                 ///  here
                 $request = $this->getRequestObject();

            })
        );
    }

    public function getName() {

        return "xyz";

    }

}
4

3 に答える 3

20

拡張機能をサービスとして登録し、コンテナー サービスを提供します。

# services.yml

services:

    sybio.twig_extension:
        class: %sybio.twig_extension.class%
        arguments: 
            - @service_container
        tags:
            - { name: twig.extension, priority: 255 }

次に、(小枝拡張) クラス コンストラクターでコンテナーを取得し、次に要求を取得します。

<?php 
    // Your class file:

    // ...

    class MyClass extends \Twig_Extension
    {
        /**
         * @var ContainerInterface
         */
        protected $container;

        /**
         * @var Request
         */
        protected $request;

        /**
         * Constructor
         * 
         * @param ContainerInterface $container
         */
        public function __construct($container)
        {
            $this->container = $container;

            if ($this->container->isScopeActive('request')) {
                $this->request = $this->container->get('request');
            }
        }

        // ...

コンソール コマンドの実行時に要求がないため、スコープをテストすると便利であることに注意してください。これにより、警告が回避されます。

以上で、 request を使用できるようになります。

于 2013-03-29T17:01:20.060 に答える
6

'needs_environment' => trueを設定することをお勧めします。これは、関数の最初の引数としてTwig_SimpleFunction追加されます。\Twig_Environment次に、関数で次のようなリクエストを見つけることができます。

$request = $twig->getGlobals()['app']->getRequest();

したがって、関数全体は次のようになります。

...
public function getFunctions() {
    return [
        new \Twig_SimpleFunction('xyz', function(\Twig_Environment $env) {
            $request = $twig->getGlobals()['app']->getRequest();
        }, [
            'needs_environment' => true,
        ]),
    ];
}
...
于 2016-03-01T07:11:54.377 に答える