Подтвердить что ты не робот

Как получить объект Request внутри расширения Twig в Symfony?

Как получить доступ к объекту Request внутри Расширение Twig?

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";

    }

}
4b9b3361

Ответ 1

Зарегистрируйте свое расширение как услугу и передайте ему службу контейнера:

# services.yml

services:

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

Затем извлеките контейнер с помощью конструктора класса (twig extension) и затем выполните запрос:

<?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');
            }
        }

        // ...

Обратите внимание, что проверка области действия полезна, потому что при запуске консольной команды нет запроса, она позволяет избежать предупреждений.

Чтобы это, вы можете использовать запрос!

Ответ 2

Как указано в комментариях, здесь предпочтительный способ ввода запроса в любую службу. Он работает с Symfony >= 2.4.

Включение запроса и помещение нашей службы в область запроса больше не рекомендуется. Мы должны вместо этого использовать стек запросов.

namespace AppBundle\Twig;

use Symfony\Component\HttpFoundation\RequestStack;

class MyClass extends \Twig_Extension
{
    private $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    public function getFunctions()
    {
        $requestStack = $this->requestStack;

        return array(
            new \Twig_SimpleFunction('xyz', function($param) use ($requestStack) {
             $request = $requestStack->getCurrentRequest();
           })
        );
    }

    public function getName()
    {
        return "xyz";
    }
}

приложение /Config/services.yml

app.twig_extension:
    class: AppBundle\Twig\MyExtension
    arguments:
        - '@request_stack'
    tags:
        - { name: twig.extension }

Docs:

Ответ 3

Я бы предложил установить '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,
        ]),
    ];
}
...