在DoctrineFixturesBundle中,如果我想按指定的顺序执行fixture,我必须在任何fixture类方法中创建,如下所示:
public function getOrder()
{
return 2;
}
指定顺序不是一种令人舒服的方式。
在Laravel框架中,我可以这样做:
class DatabaseSeeder extends Seeder
{
public function run()
{
$this->call('PositionsSeeder');
$this->call('UsersSeeder');
$this->call('PostsSeeder');
}
}
我的问题是:我可以在symfony中这样做吗?
我看到了一种解决方案。我可以用下面的代码做BaseFixture:
class LoadBrandData extends AbstractFixture
{
public function load(ObjectManager $manager)
{
(new LoadPositionsData())->load(manager);
(new LoadUsersData())->load(manager);
(new LoadPostsData())->load(manager);
}
}
但也许我能做得更好。我能?
发布于 2016-11-25 07:48:12
这就是我要做的。
创建一个将存储加载顺序的类。
<?php
namespace AppBundle\DataFixtures;
use AppBundle\DataFixtures\ORM\LoadClientData;
use AppBundle\DataFixtures\ORM\LoadRoleData;
use AppBundle\DataFixtures\ORM\LoadUserData;
class Order
{
const FIXTURES = [
LoadRoleData::class,
LoadUserData::class,
LoadClientData::class,
];
}
然后,在您的抽象fixture类(将由所有其他fixture继承的类)中,创建以下方法:
/**
* @return int
* @throws \Exception
*/
public function getOrder()
{
$order = array_search(get_called_class(), Order::FIXTURES);
if ($order === false) {
throw new \Exception('Seems like you forgot to put things in Order');
}
return $order;
}
您不应该直接从fixture本身调用getOrder
方法。
发布于 2019-08-03 05:41:00
您还可以使用前缀命名fixtures文件
00-MyFirstFixtures.php
01-MySecondFixtures.php
02-MyThirdFixtures.php
...etc
显然,不要忘记以相同的方式命名您的类
class 00-MyFirstFixtures extends Fixture
{
...
}
https://stackoverflow.com/questions/33234690
复制相似问题