Symfony2 fixtures with order - 更好的方法
Symfony2 fixtures with order - better way
在 DoctrineFixturesBundle 中,如果我想按指定顺序执行固定装置,我必须在任何固定装置 class 方法中创建,如下所示:
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);
}
}
但也许我可以做得更好。可以吗?
即使你不喜欢,最好的方法是通过getOrder()
方法。
话虽如此,至少有两个技巧可以用来以其他方式设置顺序:
- 在一个文件中定义所有灯具。只有当你没有定义很多固定装置时才有意义。
- 在一个目录中定义所有灯具,并将加载顺序作为文件名的一部分(它们按字母顺序加载)。这仅在您遵循单捆绑方法开发 Symfony 应用程序时才有效。
我就是这样做的。
创建一个 class 来存储加载顺序。
<?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,
];
}
然后,在您的抽象装置 class(将被所有其他装置继承的装置)中,创建以下方法:
/**
* @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;
}
切勿直接从灯具本身调用 getOrder
方法。
你可以使用 Doctrine DependentFixtureInterface;请检查以下示例:
namespace MyDataFixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
class MyFixture extends AbstractFixture implements DependentFixtureInterface
{
public function load(ObjectManager $manager)
{}
public function getDependencies()
{
return array('MyDataFixtures\MyOtherFixture'); // fixture classes fixture is dependent on
}
}
class MyOtherFixture extends AbstractFixture
{
public function load(ObjectManager $manager)
{}
}
您还可以使用前缀命名灯具文件
00-MyFirstFixtures.php
01-MySecondFixtures.php
02-MyThirdFixtures.php
...等等
显然,别忘了用同样的方式给你命名 class
class 00-MyFirstFixtures extends Fixture
{
...
}
在 DoctrineFixturesBundle 中,如果我想按指定顺序执行固定装置,我必须在任何固定装置 class 方法中创建,如下所示:
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);
}
}
但也许我可以做得更好。可以吗?
即使你不喜欢,最好的方法是通过getOrder()
方法。
话虽如此,至少有两个技巧可以用来以其他方式设置顺序:
- 在一个文件中定义所有灯具。只有当你没有定义很多固定装置时才有意义。
- 在一个目录中定义所有灯具,并将加载顺序作为文件名的一部分(它们按字母顺序加载)。这仅在您遵循单捆绑方法开发 Symfony 应用程序时才有效。
我就是这样做的。
创建一个 class 来存储加载顺序。
<?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,
];
}
然后,在您的抽象装置 class(将被所有其他装置继承的装置)中,创建以下方法:
/**
* @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;
}
切勿直接从灯具本身调用 getOrder
方法。
你可以使用 Doctrine DependentFixtureInterface;请检查以下示例:
namespace MyDataFixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
class MyFixture extends AbstractFixture implements DependentFixtureInterface
{
public function load(ObjectManager $manager)
{}
public function getDependencies()
{
return array('MyDataFixtures\MyOtherFixture'); // fixture classes fixture is dependent on
}
}
class MyOtherFixture extends AbstractFixture
{
public function load(ObjectManager $manager)
{}
}
您还可以使用前缀命名灯具文件
00-MyFirstFixtures.php
01-MySecondFixtures.php
02-MyThirdFixtures.php
...等等
显然,别忘了用同样的方式给你命名 class
class 00-MyFirstFixtures extends Fixture
{
...
}