如何在Symfony中的Twig扩展中获取Request对象?

use*_*356 20 symfony twig

如何访问Twig Extension中Request对象?

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

    }

}
Run Code Online (Sandbox Code Playgroud)

Jak*_*las 40

根据评论中的要求,这是将请求注入任何服务的首选方式.它适用于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";
    }
}
Run Code Online (Sandbox Code Playgroud)

应用程序/配置/ services.yml

app.twig_extension:
    class: AppBundle\Twig\MyExtension
    arguments:
        - '@request_stack'
    tags:
        - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

文档:


Syb*_*bio 20

将您的扩展注册为服务并为其提供容器服务:

# services.yml

services:

    sybio.twig_extension:
        class: %sybio.twig_extension.class%
        arguments: 
            - @service_container
        tags:
            - { name: twig.extension, priority: 255 }
Run Code Online (Sandbox Code Playgroud)

然后通过(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');
            }
        }

        // ...
Run Code Online (Sandbox Code Playgroud)

请注意,测试范围很有用,因为在运行console命令时没有请求,它会避免警告.

就是这样,你可以使用这个请求!

  • 原始"容器"服务?馊主意 (5认同)
  • @JakubZalas你应该发布它作为更多可见性的答案. (3认同)

小智 5

我建议'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,
        ]),
    ];
}
...
Run Code Online (Sandbox Code Playgroud)