如何将服务注入Symfony 2数据夹具?

时间:2011-12-30 03:25:14

标签: symfony doctrine-orm

如何将服务注入Symfony2/Doctrine2 Data Fixtures?我想创建虚拟用户并需要security.encoder_factory服务来编码我的密码。

我尝试将我的数据夹具定义为服务

myapp.loadDataFixture:
    class: myapp\SomeBundle\DataFixtures\ORM\LoadDataFixtures
    arguments:
        - '@security.encoder_factory'

然后在我的数据夹具

class LoadDataFixtures implements FixtureInterface {

    protected $passwordEncoder;

    public function __construct($encoderFactory) {
        $this->passwordEncoder = $encoderFactory->getEncoder(new User());
    }

    public function load($em) {

但是有点像

  

警告:缺少参数1   ... \ DataFixtures \ ORM \ LoadDataFixtures :: __ construct(),在...中调用

2 个答案:

答案 0 :(得分:38)

Using the Container in the Fixtures部分准确描述了您的需求。

您需要做的就是在灯具中实现ContainerAwareInterface。这将导致Symfony通过Setter-Injection注入容器。示例实体如下所示:

class LoadDataFixtures implements FixtureInterface, ContainerAwareInterface {

     /**
     * @var ContainerInterface
     */
    private $container;

    public function setContainer(ContainerInterface $container = null)
    {
        $this->container = $container;
    }

    public function load($em) {

需要将灯具注册为服务。确保通过use导入已使用的类。

答案 1 :(得分:0)

对于DoctrineFixturesBundle v。3,您无需注入容器即可注入简单的服务。您可以改用普通的依赖注入:

// src/DataFixtures/AppFixtures.php
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

// ...
private $encoder;

public function __construct(UserPasswordEncoderInterface $encoder)
{
    $this->encoder = $encoder;
}

但是,如果确实需要该容器,则可以通过$ this-> container属性访问它。

文档here