【问题标题】:Load Container and EntityManager within a fixture in Symfony2在 Symfony2 的夹具中加载 Container 和 EntityManager
【发布时间】:2015-07-18 17:12:16
【问题描述】:

我的 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;
    }

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

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

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

非常感谢。

【问题讨论】:

  • 如何在数据库中插入类别?学说也是固定的吗?
  • 是的,我将它作为固定装置插入。为了首先加载类别,在我的 LoadCategory.php 中,我放了 > public function getOrder() { return 1;在我的 LoadSport.php 中,我把 > public function getOrder() { return 2; }
  • @Nadjib - 除非您执行我在下面写的操作,否则您不会停止收到该错误。这很简单。

标签: symfony doctrine-orm


【解决方案1】:

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

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

更新

如下所述,虽然这种方法既好又简单,但在处理夹具中的数据时可能会导致问题。 Symfony Docs 详细说明了执行此操作的正确方法。

【讨论】:

  • 您好 GM,感谢您的回答,但我已经尝试过了,它仍然显示相同的错误:> [Symfony\Component\Debug\Exception\ContextErrorException] 可捕获的致命错误:参数 1 传递给 MyBundle \Entity\Sport::setCategory() 必须是 MyBundle\Entity\Category 的实例,给定 null,在 .../MyBundle/DataFixtures/ORM/LoadSport.php 第 xx 行调用并定义你知道其他原因吗?错误可能来自哪里?
  • 再次尝试后,它成功了。上次我一定是在别处犯了错误。非常感谢您的帮助 GM,我很感激。
  • 这是一个“坏习惯”。 @Nadjib - 您正在使用固定装置填充类别,然后您将获得带有引用的类别 - Sharing Objects between Fixtures
  • 与 Symfony 4 相同 $manager->getRepository(Category::class) ->findOneById(1);
猜你喜欢
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 2014-06-08
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 2011-08-08
相关资源
最近更新 更多