如何将请求堆栈注入到树枝扩展中

pet*_*ner 4 php request symfony

我正在尝试创建扩展以呈现分页。它需要请求和路由器才能创建URL,所以我这样做了:

services.yml:

app.twig_extension:
    class: MyBundle\Twig\MyExtension
    public: false
    calls:
      - [setRequest, [@request_stack]]
      - [setRouter, [@router]]
    tags:
        - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

然后在我的扩展中:

private $router;

private $request;

public function setRouter( UrlGeneratorInterface $router )
{
    $this->router = $router;
}

public function setRequest(RequestStack $requestStack)
{
    $this->request = $requestStack->getCurrentRequest();
}
Run Code Online (Sandbox Code Playgroud)

...

public function renderPaginator(\Twig_Environment $twig, $paginator, array $options = array())
{

    if ( 1 == $paginator->getNumPages() )
    {
        return false;
    }
    var_dump($this->request);
    die();
Run Code Online (Sandbox Code Playgroud)

原来var_dump会输出null。尽管如果我在setRequest方法中执行var_dump,则实际上会打印一个Request对象。任何的想法?谢谢!

Ger*_*rry 5

构造树枝扩展时,堆栈中没有任何请求,该请求为空。

您应该延迟将请求从堆栈中检索到renderPaginator()方法。

服务定义:

app.twig_extension:
    class: MyBundle\Twig\MyExtension
    public: false
    arguments: [@request_stack, @router]
    tags:
        - { name: twig.extension }
Run Code Online (Sandbox Code Playgroud)

服务:

public function __construct(RequestStackInterface $requestStack, RouterInterface $router)
{
    $this->requestStack = $requestStack;
    $this->router = $router;
}

public function renderPaginator(\Twig_Environment $twig, $paginator, array $options = array())
{

    if ( 1 == $paginator->getNumPages() )
    {
        return false;
    }
    var_dump($this->requestStack->getCurrentRequest());
    die();
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,不要在__constructor中调用getCurrentRequest()。 (3认同)