Symfony2灯具订单 - 更好的方式

Kam*_*l P 1 doctrine fixtures symfony

在DoctrineFixturesBundle中,如果我想按指定的顺序执行fixtures,我必须在任何fixture类方法中创建如下:

public function getOrder()
{
    return 2;
}
Run Code Online (Sandbox Code Playgroud)

指定订单并不舒服.

在Laravel Framework中,我可以这样做:

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call('PositionsSeeder');
        $this->call('UsersSeeder');
        $this->call('PostsSeeder');
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是:我可以在symfony中这样做吗?

我看到一个解决方案.我可以使用以下代码制作BaseFixture:

class LoadBrandData extends AbstractFixture
{
    public function load(ObjectManager $manager)
    {
        (new LoadPositionsData())->load(manager);
        (new LoadUsersData())->load(manager);
        (new LoadPostsData())->load(manager);

    }
}
Run Code Online (Sandbox Code Playgroud)

但也许我可以做得更好.我可以吗?

小智 8

您可以使用 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)
    {}
}
Run Code Online (Sandbox Code Playgroud)

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


Jav*_*luz 5

即使你不喜欢它,实现这一目标的最佳方法是通过该getOrder()方法.

话虽如此,您可以使用至少两个技巧以其他方式设置订单:

  • 在一个文件中定义所有灯具.只有你没有定义很多灯具才有意义.
  • 在一个目录中定义所有灯具,并将加载顺序作为文件名的一部分(按字母顺序加载).这仅在您按照单捆绑方法开发Symfony应用程序时才有效.