我有一个twig扩展,我想注入路由器服务,所以... services.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;
}
当我执行代码时,我收到以下错误:
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' => ...
所以...它实际上传递了一个路由器对象。那么...为什么我会得到错误?我在这一点上完全迷失了。
--- 更新 --- 这是我目前找到的: - 在/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());
现在,这个扩展程序不能通过路由器。但是它确实传递了一些依赖关系给其他扩展程序。所以一定有某种原因导致我的扩展程序无法运作。