Symfony2:服务容器没有传递给控制器​​构造函数

时间:2014-11-29 19:07:34

标签: php symfony dependency-injection controller

是的 - 我搜索了一个答案并花了几个小时与谷歌。但麻烦仍然是实际的

class IndexController extends Controller\CommonController
{
    private $container;
    public function __construct(Container $container) {
        $this->container = $container;
    }

在config.yml

shop.website.index_controller:
    class: %shop.website.index_controller%
    parent: shop.common.common_controller
    arguments:  [@service_container]

  

捕获致命错误:参数1传递给   Shop \ WebSiteBundle \ Controller \ IndexController :: __ construct()必须   实现接口   Symfony \ Component \ DependencyInjection \ ContainerInterface,没有给出,   呼唤   I:\ SF2 \ WWW \供应商\ symfony的\ symfony中的\ src \的Symfony \包\ FrameworkBundle \控制器\ ControllerResolver.php   在第77行并在中定义   我:\ sf2 \ www \ src \ Shop \ WebSiteBundle \ Controller \ IndexController.php一行   13

有人可以解释错误在哪里吗?

请在yml / annotaions中配置(导致配置的不同类型让我发疯)

提前致谢

P.S>更新了代码ID

services:
    shop.common.common_controller:
        abstract: true
        class: %shop.common.common_controller%
        arguments: ["@templating"]

use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;

class CommonController
{
    protected $templating;

    public function __construct(EngineInterface $templating)
    {
        $this->templating = $templating;
    }

相同的结果(

4 个答案:

答案 0 :(得分:5)

您是如何在路线中配置控制器的?

我感觉您没有使用“Controller as a service”符号:

my_controller:
    pattern:   /
    defaults:  { _controller: shop.website.index_controller:indexAction }

此语法与默认路由语法不同。看看here

答案 1 :(得分:1)

您无需扩展任何其他文件/控制器。

首先删除延伸。

添加:

use Symfony\Component\DependencyInjection\ContainerInterface;

替换:

Container $container

ContainerInterface $container

答案 2 :(得分:1)

Posilbe的理由是下一个:

SF2直接调用你的类构造函数。但你应该说把它作为服务(提供所有服务选项作为调用/参数)

添加

/**
 * @Route(service="shop.website.index_controller")
 */
class IndexController extends Controller\CommonController
{
    private $container;
    public function __construct(Container $container) {
        $this->container = $container;
    }shop.website.index_controller

在页面http://symfony.com/doc/current/bundles/SensioFrameworkExtraBundle/annotations/routing.html#controller-as-service

重新开始

并注意Matthieu Napoli的回答

答案 3 :(得分:-1)

为什么要将容器注入控制器?

只需扩展Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller,您就可以访问以下任何服务:

    namespace AppBundle\Controller;

    use Symfony\Bundle\FrameworkBundle\Controller\Controller;

    class HelloController extends Controller
    {
        public function indexAction()
        {
            // ...
            $myService = $this->get('my_service');
        }
    }