如何从数据固定装置(或其他任何地方)中获取DIC


How to get the DIC from within a data fixture (or anywhere else)?

我想使用数据固定装置来创建用于测试目的的用户。

问题是我需要FOS的用户经理:

$userManager = $container->get('fos_user.user_manager');

为此,我需要这个容器。那么我该怎么得到它呢?这不像在控制器中,我不能执行$this->get('fos_user.user_manager')

最简单的解决方案是扩展Symfony''Component''DependencyInjection''Containerware。

<?php
namespace SomeCompany'SomeBundle'DataFixtures'MongoDB;
use Doctrine'Common'DataFixtures'FixtureInterface;
use Doctrine'Common'Persistence'ObjectManager;
use Symfony'Component'DependencyInjection'ContainerAware;
use Symfony'Component'DependencyInjection'ContainerInterface;
use SomeCompany'SomeBundle'Document'User;
class LoadUsers extends ContainerAware implements FixtureInterface
{   
    /**
     * {@inheritDoc}
     */
    public function load(ObjectManager $manager)
    {
        $userManager = $this->container->get('fos_user.user_manager');
        $user = $userManager->createUser();
        $user->setUsername('myuser');
        $user->setEmail('a@a.com');
        $user->setPlainPassword('mypass');
        $user->addRole('ROLE_USER');
        $user->setEnabled(true);
        $userManager->updateUser($user);
    }
}

如果您已经在扩展另一个类,那么您必须实现ContainerwareInterface,它只需要额外的几行代码。

不幸的是,这只适用于使用控制台的情况。通过API加载固定装置不能很好地实现容器感知,并导致错误、冻结和其他问题。

相关文章: