Php 以整洁的方式加载数十个数据装置

Php 以整洁的方式加载数十个数据装置,php,symfony,doctrine,fixtures,Php,Symfony,Doctrine,Fixtures,在我正在开发的应用程序中,我有一个媒体实体,它与其他几个实体有关联:演讲者,标签,类别,等等 在下面的代码中,我展示了我为创建一些测试数据而编写的一个fixture。显然,要设置和分配数据之间的大量关系需要很长的时间 公共函数加载(ObjectManager$manager) { $videoType=新媒体类型(); $videoType->setName('video'); $videoType->setType('video'); $manager->persist($videoType)

在我正在开发的应用程序中,我有一个
媒体
实体,它与其他几个实体有关联:
演讲者
标签
类别
,等等

在下面的代码中,我展示了我为创建一些测试数据而编写的一个fixture。显然,要设置和分配数据之间的大量关系需要很长的时间

公共函数加载(ObjectManager$manager)
{
$videoType=新媒体类型();
$videoType->setName('video');
$videoType->setType('video');
$manager->persist($videoType);
$speaker1=新扬声器();
$speaker1->setName('Joe Bloggs');
$speaker1->setBiography('Joe Bloggs bio');
$manager->persist($speaker1);
$category1=新类别();
$category1->setName('PHP');
$category1->setSlug('php');
$manager->persist($category1);
$tag1=新标签();
$tag1->setName('PHPNW');
$tag1->固定凸耳('phpnw');
$manager->persist($tag1);
$video1=新媒体();
$video1->setMediatype($videoType);
$video1->设置扬声器(
新阵列集合(
排列(
$speaker1
)
)
);
$video1->setCategories(
新阵列集合(
排列(
$category1
)
)
);
$video1->setTags(
新阵列集合(
排列(
$tag1
)
)
);
$video1->setDate(new\Datetime());
$video1->setCreationDate(new\DateTime());
$video1->setTitle(“我的PHP视频”);
$video1->setDescription('A video about PHP!');
$video1->setContent($1)http://some.video-url.com');
$video1->setLength('20:00:00');
$video1->设置等级(2.5);
$video1->setvisions(100);
$video1->setLanguage('EN');
$video1->setHostName('PHP');
$video1->setHostUrl('php');
$video1->setStatus('pub');
$manager->persist($video1);
$manager->flush();
}
现在我想用真实数据替换这个fixture,并在一个fixture中加载十几个
Media
实体。我可以复制粘贴十几次,然后对数据进行更改,但这样做既麻烦又难以维护。有没有一种很好的方法可以像这样加载许多相同类型的实体?

我意识到这个包已经完全满足了我的需求

为此,我将每个实体加载到它们自己的fixture中,并执行
$this->addReference('admin-user',$user))
使用
$this->getReference('admin-user')从另一个设备访问它

加载依赖的装置也很容易:

公共函数getDependencies()
{
//此设备所依赖的设备类
返回数组('MyDataFixture\MyOtherFixture');
}
现在我的固定装置看起来像这样:

公共函数加载(ObjectManager$manager)
{
$video1=新媒体();
$video1->setMediatype($this->getReference('video'));
$video1->设置扬声器(
新阵列集合(
排列(
$this->getReference('joe-bloggs')
)
)
);
$video1->setCategories(
新阵列集合(
排列(
$this->getReference('php')
)
)
);
$video1->setTags(
新阵列集合(
排列(
$this->getReference('phpnw')
)
)
);
$video1->setDate(new\Datetime());
$video1->setCreationDate(new\DateTime());
$video1->setTitle(“我的PHP视频”);
$video1->setDescription('A video about PHP!');
$video1->setContent($1)http://some.video-url.com');
$video1->setLength('20:00:00');
$video1->设置等级(2.5);
$video1->setvisions(100);
$video1->setLanguage('EN');
$video1->setHostName('PHP');
$video1->setHostUrl('php');
$video1->setStatus('pub');
$manager->persist($video1);
$manager->flush();
}
/**
*加载此附件
*@见https://github.com/doctrine/data-fixtures
*
*@return数组
*/
公共函数getDependencies()
{
返回数组(
“…\LoadMediatypeData”,
“…\LoadSpeakerData”,
“…\LoadCategoryData”,
“…\LoadTagData”
);
}

您看过Symfony生成器吗?还有一个,它允许您在YAML文件中定义夹具(我相信生成器也会这样做)。因此,也许只是循环此代码并用生成的字符串替换字符串?Faker看起来不错,但我谈论的更多是代码布局和可读性,而不是生成fixture的不同方法。请注意,您需要扩展
原则\Common\datafixture\AbstractFixture
,并实现
Doctrine\Common\DataFixtures\OrderedFixtureInterface
使此设置正常工作。