2015-02-23 65 views
3

我试图创建一个扩展来呈现分页。它需要的要求,并能够创建网址的路由器,所以我这样做:如何将请求堆栈注入一个树枝分机

services.yml:

app.twig_extension: 
    class: MyBundle\Twig\MyExtension 
    public: false 
    calls: 
     - [setRequest, [@request_stack]] 
     - [setRouter, [@router]] 
    tags: 
     - { name: twig.extension } 

然后在我的扩展:

private $router; 

private $request; 

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

public function setRequest(RequestStack $requestStack) 
{ 
    $this->request = $requestStack->getCurrentRequest(); 
} 

...

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

    if (1 == $paginator->getNumPages()) 
    { 
     return false; 
    } 
    var_dump($this->request); 
    die(); 

原来,var_dump打印出null。尽管如果我在setRequest方法中执行var_dump,它实际上会打印一个Request对象。 有什么想法?谢谢!

回答

3

构建树枝扩展时,堆栈中没有请求,它是空的。

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

服务定义:

app.twig_extension: 
    class: MyBundle\Twig\MyExtension 
    public: false 
    arguments: [@request_stack, @router] 
    tags: 
     - { name: twig.extension } 

服务:

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(); 
} 
+0

我试过了,但我得到了“调用成员函数getCurrentRequest()在非对象”错误。我改变了setRequestStack方法,如果我在paginator方法中执行了var_dump($ this-> requestStack),我得到了null。我正在使用symfony 2.6 btw – petekaner 2015-02-23 11:44:47

+0

检查修改的服务定义。实际上,你甚至应该做构造函数注入而不是setter注入来避免这些问题。 – Gerry 2015-02-23 11:48:15

+0

嗯,不起作用“参数1传递给SeoReportBundle \ Twig \ SeoReportExtension :: __ construct()必须是Symfony \ Component \ HttpFoundation \ RequestStack的一个实例,没有给出” – petekaner 2015-02-23 12:27:25