Symfony 2依赖注入“必须是”的实例“(构造函数可能没有被传递。)

时间:2013-07-12 00:25:31

标签: symfony dependency-injection

我目前正在尝试将一个类的依赖注入到另一个类中。 我试图将其基于Symfony2文档中有关Newsletter / Mailer的示例。 我目前收到此错误:

Catchable Fatal Error:
Argument 1 passed to Me\MyBundle\Resources\component\SecondClass::__construct()
must be an instance of Me\MyBundle\Resources\component\FirstClass\FirstClass,
none given

MyBundle.php

namespace Me\MyBundle;

use Symfony\Component\HttpKernel\Bundle\Bundle;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;
use Resources\component\FirstClass;
use Resources\component\SecondClass;

class MeMyBundle extends Bundle
{
    public function build(ContainerBuilder $container)
    {
        parent::build($container);
        $container
            ->register('first_class', 'FirstClass');

        $container
            ->register('second_class', 'SecondClass')
            ->addArgument(new Reference('first_class'));
    }
}

/Resources/component/FirstClass.php

<?php
namespace Me\MyBundle\Resources\component;

class FirstClass
{
    ....
}

/Resources/component/SecondClass.php

<?php
namespace Me\MyBundle\Resources\component;

class SecondClass {    

    private $firstClass;

    public function __construct ( FirstClass\FirstClass $firstClass ) {
        $this->firstClass = $firstClass;
    }
    ....

关于哪里出错的任何想法?我得到的印象是新的Reference('first_class')没有传递任何东西。 我假设,使用上面的方法,没有什么需要添加到我的services.yml

感谢。

更新:(这是我必须做的,让它发挥作用)

MyBundle.php

$container
    ->register('first_class', 'Me\MyBundle\Resources\component\FirstClass');

$container
    ->register('second_class', 'Me\MyBundle\Resources\component\SecondClass')
    ->addArgument(new Reference('first_class'));

SecondClass.php

public function __construct ( LanguageCodes $langCodes )

这主要是与名称空间的斗争。

感谢Cerad的耐心,我终于把它分类了。

1 个答案:

答案 0 :(得分:0)

为什么你有这个:

$container = new ContainerBuilder(); ?

$ container作为参数传递。而且我怀疑你没有使用容器来获取物体。

你在某处做这件事:

$instance = $this->container->get('second_class");

或者你在尝试:

$instance = new SecondClass();