Загрузка десятков приспособлений данных аккуратным образом
У меня есть сущность Media
в приложении, над которым я работаю, которая имеет ассоциации с несколькими другими сущностями: Speaker
, Tag
, Category
, и т.д.
В приведенном ниже коде я показал приспособление, которое я написал, чтобы создать некоторые тестовые данные. Очевидно, что это очень долго для того, чтобы настроить и назначить многочисленные отношения между данными.
public function load(ObjectManager $manager)
{
$videoType = new Mediatype();
$videoType->setName('video');
$videoType->setType('video');
$manager->persist($videoType);
$speaker1 = new Speaker();
$speaker1->setName('Joe Bloggs');
$speaker1->setBiography('Joe Bloggs bio.');
$manager->persist($speaker1);
$category1 = new Category();
$category1->setName('PHP');
$category1->setSlug('php');
$manager->persist($category1);
$tag1 = new Tag();
$tag1->setName('PHPNW');
$tag1->setSlug('phpnw');
$manager->persist($tag1);
$video1 = new Media();
$video1->setMediatype($videoType);
$video1->setSpeakers(
new ArrayCollection(
array(
$speaker1
)
)
);
$video1->setCategories(
new ArrayCollection(
array(
$category1
)
)
);
$video1->setTags(
new ArrayCollection(
array(
$tag1
)
)
);
$video1->setDate(new Datetime());
$video1->setCreationDate(new DateTime());
$video1->setTitle('My video about PHP');
$video1->setDescription('A video about PHP!');
$video1->setContent('http://some.video-url.com');
$video1->setLength('20:00:00');
$video1->setRating(2.5);
$video1->setVisits(100);
$video1->setLanguage('EN');
$video1->setHostName('PHP');
$video1->setHostUrl('php');
$video1->setStatus('pub');
$manager->persist($video1);
$manager->flush();
}
Теперь я хочу заменить этот прибор реальными данными и загрузить дюжину или около того объектов Media
в один прибор. Я мог бы скопировать и вставить его дюжину раз и внести изменения в текст. данные, но это грязно и труднее поддерживать. Есть ли хороший способ загрузить множество объектов одного и того же типа?1 ответ:
Я понял, что связка доктрина/данные-приспособления уже делает именно то, что я хотел.
Для этого я загружаю каждый объект в свой собственный фиксатор и делаю
$this->addReference('admin-user', $user);
для доступа к нему из другого фиксатора, используя$this->getReference('admin-user');
Загрузка приспособлений, являющихся зависимостями, также проста:
public function getDependencies() { // fixture classes that this fixture is dependent on return array('MyDataFixtures\MyOtherFixture'); }
Итак, теперь мое приспособление выглядит так:
public function load(ObjectManager $manager) { $video1 = new Media(); $video1->setMediatype($this->getReference('video')); $video1->setSpeakers( new ArrayCollection( array( $this->getReference('joe-bloggs') ) ) ); $video1->setCategories( new ArrayCollection( array( $this->getReference('php') ) ) ); $video1->setTags( new ArrayCollection( array( $this->getReference('phpnw') ) ) ); $video1->setDate(new \Datetime()); $video1->setCreationDate(new \DateTime()); $video1->setTitle('My video about PHP'); $video1->setDescription('A video about PHP!'); $video1->setContent('http://some.video-url.com'); $video1->setLength('20:00:00'); $video1->setRating(2.5); $video1->setVisits(100); $video1->setLanguage('EN'); $video1->setHostName('PHP'); $video1->setHostUrl('php'); $video1->setStatus('pub'); $manager->persist($video1); $manager->flush(); } /** * Load this fixtures dependencies * @see https://github.com/doctrine/data-fixtures * * @return array */ public function getDependencies() { return array( '...\LoadMediatypeData', '...\LoadSpeakerData', '...\LoadCategoryData', '...\LoadTagData' ); }