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)
    {}
}

来源:https://github.com/doctrine/data-fixtures

您还可以使用前缀命名灯具文件

00-MyFirstFixtures.php
01-MySecondFixtures.php
02-MyThirdFixtures.php

...等等

显然,别忘了用同样的方式给你命名 class

class 00-MyFirstFixtures extends Fixture
{
  ...
}