Я был ContainerAwareInterface в моем классе LoadAdvert, поэтому я могу вызвать и использовать EntityManager для извлечения пользователей в базе данных.
Однако при выполнении доктрины php bin/console: fixtures: load диспетчер объектов извлекает только пустой массив, как будто в db не было пользователя.
<?php
// src/OC/PlatformBundle/DataFixtures/ORM/LoadCategory.php
namespace OC\PlatformBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\FixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use OC\PlatformBundle\Entity\Advert;
use OC\UserBundle\Entity\User;
class LoadAdvert implements FixtureInterface, ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
private $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
// Dans l'argument de la méthode load, l'objet $manager est l'EntityManager
public function load(ObjectManager $manager)
{
$em = $this->container->get('doctrine.orm.entity_manager');
$author = $em->getRepository('OCUserBundle:User')->findAll();
die(var_dump($author));
Вот как я это делаю. Главное - установить ссылку на созданные пользователем объекты, а затем вызвать их в другом файле прибора и назначить их связанным объектам. Также важным является порядок выполнения данных прибора. Объект, связанный с нагрузкой, перед загрузкой пользователей.
'пространство имен AcmeBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LoadUserData extends AbstractFixture implements OrderedFixtureInterface, ContainerAwareInterface
{
/** @var ContainerInterface */
private $container;
/**
* Load data fixtures with the passed EntityManager
*
* @param ObjectManager $manager
*/
public function load(ObjectManager $manager)
{
$userManager = $this->container->get('fos_user.user_manager');
$user1 = $userManager->createUser();
$user1->setUsername('username1');
$user1->setPlainPassword('123');
$user1->setEmail('[email protected]');
$user1->setEnabled(true);
$user2 = $userManager->createUser();
$user2->setUsername('username2');
$user2->setPlainPassword('123');
$user1->setEmail('[email protected]');
$user2->setEnabled(true);
$manager->persist($user1);
$manager->persist($user2);
$this->setReference('user1', $user1);
$this->setReference('user2', $user2);
$manager->flush();
}
/**
* Get the order of this fixture
*
* @return integer
*/
public function getOrder()
{
return 1;
}
/**
* Sets the Container. Need it to create new User from fos_user.user_manager service
*
* @param ContainerInterface|null $container A ContainerInterface instance or null
*/
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
}
'Тогда в другом файле fixture вы не вызываете пользователя, как вы делали из базы данных, вы делаете это так:
'
$ author = $this-> getReference ('user1');
$article = new Article();
$article->addAuthor($author);
'
и затем вы добавляете этот объект $author
к связанному объекту.
Имейте в виду реализовать OrderedFixtureInterface
в этой article
и установить getOrder()
на большее число, чем для users
.