在Symfony2中的fixture中加载Container和EntityManager

时间:2015-07-18 17:12:16

标签: symfony doctrine-orm

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

每个体育运动都有一个私人'类别'属性,这是一个类别的实例。 我正在尝试检索我已经在我的数据库中的类别并将它们加载到Sports夹具中(我选择了一些运动)。我按照另一个线程中的建议,在灯具(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;
    }

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

  

[Symfony的\元器件\调试\异常\ ContextErrorException]     可捕获的致命错误:参数1传递给MyBundle \ Entity \ Sport :: setCategory()     必须是MyBundle \ Entity \ Category的实例,null给定,在... / MyBundle / DataFixtures / ORM / LoadSport.php中调用      xx和定义

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

非常感谢提前。

1 个答案:

答案 0 :(得分:4)

使用传递给load函数的ObjectManager。像这样:

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

<强>更新

如下所述,虽然这种方法很简单,但在操纵灯具中的数据时会导致问题。 Symfony Docs详细说明了执行此操作的正确方法。