如何从 Doctrine Fixture 参考中获取实体?

Posted

技术标签:

【中文标题】如何从 Doctrine Fixture 参考中获取实体?【英文标题】:How can I get an entity from Doctrine Fixture reference? 【发布时间】:2013-06-20 07:51:14 【问题描述】:

我在我的项目中添加了依赖于相互引用实体对象的数据固定装置。

在数据夹具一中,我添加了实体引用,例如:

            // GroupEntity_Fixtures.php file
    $this->addReference('GROUP_USER', $groupUser);
    $this->addReference('GROUP_ADMIN', $groupAdmin);

其中 $groupAdmin 和 $groupUser 都是 Group() 实体。在我的第二个固定装置文件中,我想通过以下方式将这些实体添加到我的用户实体中:

             //UserEntity_Fixtures.php file
             $userActive->addGroup($this->getReference('GROUP_USER'));

$userActive 是一个用户实体,与组实体具有多对多关系。不幸的是,我似乎只传递了实体的代理而不是实体本身,这会导致以下错误:

 [Symfony\Component\Debug\Exception\ContextErrorException]                    
  Catchable Fatal Error: Argument 1 passed to Blogger\BlogBundle\Entity\User:  
  :addGroup() must be an instance of Blogger\BlogBundle\Entity\groups, instan  
  ce of Proxies\__CG__\Blogger\BlogBundle\Entity\Group given, called in /home  
  /na/Practice/src/Blogger/BlogBundle/DataFixtures/ORM/CreateUserController_S  
  ignUpForm_UserEntity_Fixtures.php on line 27 and defined in /home/na/Practi  
  ce/src/Blogger/BlogBundle/Entity/User.php line 305 

如何将引用从代理转换为它期望的实体?


组夹具代码:

<?php
// DataFixtures/ORM/GroupEntity_Fixtrues.php

namespace Blogger\BlogBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
use Blogger\BlogBundle\Entity\User;
use Blogger\BlogBundle\Entity\Group;

class GroupEntity_Fixtures extends AbstractFixture implements OrderedFixtureInterface

    /**
     * @inheritDoc
     */
     public function load(ObjectManager $manager)
     
        $groupUser = new Group();
        $groupUser->setName('GROUP_USER');
        $groupUser->setRole('ROLE_USER');
        $manager->persist($groupUser);

        $groupAdmin = new Group();
        $groupAdmin->setName('GROUP_ADMIN');
        $groupAdmin->setRole('ROLE_USER,ROLE_ADMIN');
        $manager->persist($groupAdmin);

        $manager->flush();

        $this->addReference('GROUP_USER', $groupUser);
        $this->addReference('GROUP_ADMIN', $groupAdmin);
     

     public function getOrder()
     
        return 1;
     

用户设备代码

<?php
// DataFixtures/ORM/CreateUserController_SignUpForm_UserEntity_Fixtrues.php

namespace Blogger\BlogBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
use Blogger\BlogBundle\Entity\User;
use Blogger\BlogBundle\Entity\Group;

class CreateUserController_SignUpForm_UserEntity_Fixtures extends AbstractFixture implements OrderedFixtureInterface

    /**
     * @inheritDoc
     */
     public function load(ObjectManager $manager)
     
        $groupUser2 = new Group();
        $groupUser2->setName('GROUP_USER');
        $groupUser2->setRole('ROLE_USER');
        $manager->persist($groupUser2);

        // This person represents an active (email verified) user.
        $userActive = new User();
        $userActive->setPassword("passwordActive");
        $userActive->setEmail("testActive@test.com");
        $userActive->setUserName("testActive");
        $userActive->setPassword(crypt($userActive->getPassword(),$userActive->getSalt()));
        $userActive->setEmailToken(md5(uniqid(rand(), true)));
        $userActive->addGroup($groupUser2);
        //$userActive->getGroups()->add($groupRepository->getGroupByName("BASIC_USER"));

        // This person represents an unactive (email not verified) user.
        $userUnactive = new User();
        $userUnactive->setPassword("passwordUnactive");
        $userUnactive->setEmail("testUnactive@test.com");
        $userUnactive->setUserName("testUnactive");
        $userUnactive->setPassword(crypt($userUnactive->getPassword(),$userUnactive->getSalt()));
        $userUnactive->setEmailToken(md5(uniqid(rand(), true)));

        // Persist objects into the database
        $manager->persist($userActive);
        $manager->persist($userUnactive);
        $manager->flush();

     

     public function getOrder()
     
        return 2;
     

集团实体代码:

/**
 * @ORM\ManyToMany(targetEntity="User", inversedBy="groups")
 */
private $users;

用户实体代码:

/**
 * @ORM\ManyToMany(targetEntity="Group", mappedBy="users")
 */
protected $groups;

添加组方法:

/**
 * Add groups
 *
 * @param \Blogger\BlogBundle\Entity\groups $groups
 * @return User
 */
public function addGroup(\Blogger\BlogBundle\Entity\groups $groups)

    $this->groups[] = $groups;

    return $this;

【问题讨论】:

“Blogger\BlogBu​​ndle\Entity\groups”看起来很奇怪,您的 addGroup 方法中的类型提示是否正确? 还有,能贴一下addGroup()方法的代码吗?看起来你可能有错字 什么是类型提示?注释为: /** * @ORM\ManyToMany(targetEntity="User", inversedBy="groups") */ 会有一个为 addGroups 生成的方法,该方法的签名是什么,例如 public function addGroup(..... 我添加了 addGroups() 方法 【参考方案1】:

addGroup 方法有错误的类型提示:

应该是:

/**
 * Add groups
 *
 * @param \Blogger\BlogBundle\Entity\Group $groups
 * @return User
 */
public function addGroup(\Blogger\BlogBundle\Entity\Group $groups)

    $this->groups[] = $groups;

    return $this;

注意\Blogger\BlogBundle\Entity\Group 而不是\Blogger\BlogBundle\Entity\groups

【讨论】:

非常感谢。我不知道那个教义把那个方法建错了。 是的,您需要调查一下,因为其他方法可能是错误的。我不确定为什么在这种情况下会出错。可能值得一个单独的问题

以上是关于如何从 Doctrine Fixture 参考中获取实体?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 项目中的 Doctrine2 映射问题

Doctrine ODM 嵌入文档父参考

Doctrine ODM 嵌入文档父参考

从 Doctrine 中的新 YAML 迁移数据库

使用 Doctrine2 从数组水合到对象

Python Pytest自动化测试 fixture与fixture互相调用