在 Symfony2 的固定装置中加载 Container 和 EntityManager

Nad*_*jib 2 symfony doctrine-orm

我的 Symfony 项目中有两个装置,一个 LoadSport.php 和一个 LoadCategory.php。

每个运动实例都有一个私有“类别”属性,它是类别的一个实例。我正在尝试检索数据库中已有的类别并将它们加载到体育赛事中(我选择了一些运动)。我按照另一个线程中的建议,按照官方在固定装置中使用容器(http://symfony.com/doc/current/bundles/DoctrineFixturesBundle/index.html#using-the-container-in-the-fixtures)进行操作。

这是我的 LoadSport.php 代码:

class LoadSport implements FixtureInterface, ContainerAwareInterface
{
    private $container;

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

    public function load(ObjectManager $manager)
    {
        $i = 0;
        $em = $this->container->get('doctrine')->getManager();
        $category = $em->getRepository("MyBundle:Category")->findOneById(1);
        $names = array('SportA', 'SportB', 'SportC');


        foreach($names as $name)
        {
            $sport = new Sport();
            $sport->setName($name);
            $sport->setCategory($category);

            $manager->persist($sport);
        }

        $manager->flush();
    }

    public function getOrder()
    {
        return 2;
    }
Run Code Online (Sandbox Code Playgroud)

我尝试调用一个单独的管理器来获取类别 n1,当我执行 php app/consoledoctrine:fixture:load 时,我收到以下错误消息:

[Symfony\Component\Debug\Exception\ContextErrorException] 可捕获的致命错误:传递给 MyBundle\Entity\Sport::setCategory() 的参数 1 必须是 MyBundle\Entity\Category 的实例,给定 null,在 .../MyBundle 中调用/DataFixtures/ORM/LoadSport.php 在第 xx 行并定义

如何检索 id 1 的类别或 LoadSport.php 装置中的任何其他类别并设置 Sport 实例的类别?我究竟做错了什么?为什么我得到一个空值,而它应该是一个类别实体?

提前谢谢了。

Mal*_*nic 5

使用传入加载函数的 ObjectManager。就像这样:

$category = $manager->getRepository('MyBundle:Category')->findOneById(1);

更新

如下所述,虽然这种方法很好且简单,但在操作装置中的数据时可能会导致问题。Symfony 文档详细介绍了执行此操作的正确方法。