我有一个树枝扩展,我试图在其中注入路由器服务,所以......
服务.yml
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;
}
当我执行代码时,我收到此错误:
可捕获的致命错误:传递给 SeoReportBundle\Twig\SeoReportExtension::__construct() 的参数 1 必须是 Symfony\Bundle\FrameworkBundle\Routing\Router 的实例,没有给出
为了调试这个问题,我在代码中做了这个更改,以尝试了解发生了什么:
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' => ...
所以...它实际上传递了一个路由器对象。那么...为什么我会收到错误消息?我此时彻底迷失了
- - 更新 - -
这是我到目前为止发现的:
- 在 /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());
现在,这个不通过路由器。但它确实将一些依赖项传递给其他扩展。所以我的扩展不能工作肯定是有原因的