【问题标题】:How to get the DIC from within a data fixture (or anywhere else)?如何从数据夹具(或其他任何地方)中获取 DIC?
【发布时间】:2012-08-21 07:39:12
【问题描述】:

我想使用data fixture 来创建用于测试目的的用户。

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

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

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

【问题讨论】:

  • 你还没读完documentation :)
  • @m2mdas 哈哈,你找到我了,谢谢

标签: php symfony dependency-injection symfony-2.1


【解决方案1】:

最简单的solution 是扩展 Symfony\Component\DependencyInjection\ContainerAware。

<?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);
    }
}

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

【讨论】:

  • 请在您的答案中添加文档链接
【解决方案2】:

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

【讨论】:

  • 你在说什么?显示一些代码。据我所知,fixtures 是用来创建假数据来处理的,或者像基本角色这样的初始数据。为什么需要 API?只需运行命令。
  • 如果你想将它包含在你的单元测试中,那么你想通过 API 在你的 setUp() 方法中调用它。至少理论是这样的。我会证明可以,但我已经完全颠倒了。如果您怀疑我,请编写一个简单的单元测试,同时使用固定装置和容器感知。试了半天,网上列出的20种方法都不起作用,有些导致phpunit死机或进入无限循环。
猜你喜欢
  • 2021-12-03
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
相关资源
最近更新 更多