2015-02-23 83 views
2

我在那里我试图注入路由器服务一根树枝延伸,所以...... services.yml不可能路由器服务传递给树枝延伸symfony的2.6

app.twig_extension: 
    class: SeoReportBundle\Twig\SeoReportExtension 
    arguments: [@router] 
    tags: 
     - { name: twig.extension } 

扩展:

使用Symfony \ Bundle \ FrameworkBundle \ Routing \ Router;

class SeoReportExtension extends \Twig_Extension 
{ 
    private $router; 

    public function __construct(Router $router) 
    { 
     $this->router = $router; 
    } 

当我执行的代码,我得到这个错误:

Catchable Fatal Error: Argument 1 passed to SeoReportBundle\Twig\SeoReportExtension::__construct() must be an instance of Symfony\Bundle\FrameworkBundle\Routing\Router, none given

尝试调试这一点,我没有这种变化中的代码,试图了解发生了什么事情:

public function __construct($router) { 
    var_dump($router);die(); 
    $this->router = $router; } 

所以我删除了类型提示,然后我做了一个对象转储,以查看构造方法中获得的内容。令我惊讶的是,这是输出:

Object(Symfony\Bundle\FrameworkBundle\Routing\Router)[198] 
private 'container' => 
object(appDevDebugProjectContainer)[219] 
private 'parameters' => ... 

所以......它实际上传递了一个路由器对象。那么...为什么我会得到这个错误?我在这一点上完全丧失

--- UPDATE --- 这是我迄今发现: - 在/app/cache/dev/appDevDebugProjectContainer.php有在其中创建扩展两个地方:

protected function getApp_TwigExtensionService() 
    { 
     return $this->services['app.twig_extension'] = new \SeoReportBundle\Twig\SeoReportExtension($this->get('router')); 
    } 

哪个是正确的,它通过路由器构建 而且......

protected function getTwigService() 
{ 
    $this->services['twig'] = $instance = new \Twig_Environment($this->get('twig.loader'), array('debug' => true, 'strict_variables' => true, 'exception_controller' => 'twig.controller.exception:showAction', 'form_themes' => array(0 => 'form_div_layout.html.twig'), 'autoescape' => array(0 => 'Symfony\\Bundle\\TwigBundle\\TwigDefaultEscapingStrategy', 1 => 'guess'), 'cache' => (__DIR__.'/twig'), 'charset' => 'UTF-8', 'paths' => array())); 

    $instance->addExtension($this->get('app.twig_extension')); 
    ... 
    $instance->addExtension(new \Symfony\Bundle\AsseticBundle\Twig\AsseticExtension($this->get('assetic.asset_factory'), $this->get('templating.name_parser'), true, array(), array(0 => 'SeoReportBundle'), new \Symfony\Bundle\AsseticBundle\DefaultValueSupplier($this))); 
    $instance->addExtension(new \Doctrine\Bundle\DoctrineBundle\Twig\DoctrineExtension()); 
    $instance->addExtension(new \SeoReportBundle\Twig\SeoReportExtension()); 

现在,这一个不通过路由器。但它确实将某些依赖关系传递给其他扩展。因此,必须有可供\Twig_SimpleFunction实例,以及以同样的方式\Twig_SimpleFilter一个原因,矿井延伸工作不

+0

只是咧嘴笑,拿出大众:虚假的属性。您可以使用public:false来忽略此文档。 – Cerad 2015-02-23 15:10:17

+0

完成!问题依然存在:) – petekaner 2015-02-23 15:17:30

+0

删除die();也许构建被称为第二次没有路由器。 – gries 2015-02-23 15:27:10

回答

0

树枝环境,虽然嫩枝文档only show it for filters。从大环境,你可以得到的路由扩展这样的:

/** 
* {@inheritdoc} 
*/ 
public function getFunctions(): array 
{ 
    return array(
     new \Twig_SimpleFunction('get_my_link_thing', array($this, 'getMyLinkThing'), array('needs_environment' => true)), 
    ); 
} 

/** 
* Get something with a generated link. 
* 
* @return string 
*/ 
public function getMyLinkThing(\Twig_Environment $env): string 
{ 
    $targetUrl = $env->getExtension('routing')->getPath('my_route_name'); 

    return sprintf('Link is <a href="%s">here</a>!', $targetUrl); 
} 

有很多在$env其他时髦的东西 - 这是值得尝试dump(get_class_methods($env));然后倾倒调用有什么能冲击你看中的结果。