nnx/data-fixtures

所有 Doctrine 对象管理器的数据固定

2.0.0 2016-09-07 12:17 UTC

README

Build Status

此扩展旨在提供一种简单的方式来管理和执行 Doctrine ORM 或 ODM 的数据固定加载。您可以通过实现 Doctrine\Common\DataFixtures\FixtureInterface 接口来编写固定类

namespace MyDataFixtures;

use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\FixtureInterface;

class UserFixtureLoader implements FixtureInterface
{
    public function load(ObjectManager $manager)
    {
        $user = new User();
        $user->setUsername('jwage');
        $user->setPassword('test');

        $manager->persist($user);
        $manager->flush();
    }
}

现在您可以开始将固定添加到加载实例中

use Doctrine\Common\DataFixtures\Loader;
use MyDataFixtures\LoadUserData;

$loader = new Loader();
$loader->addFixture(new LoadUserData());

您还可以从目录中加载一组固定

$loader->loadFromDirectory('/path/to/MyDataFixtures');

或者您可以从文件中加载一组固定

$loader->loadFromFile('/path/to/MyDataFixtures/MyFixture1.php');

您可以使用 getFixtures() 方法获取添加的固定

$fixtures = $loader->getFixtures();

现在您可以轻松执行固定

use Doctrine\Common\DataFixtures\Executor\ORMExecutor;
use Doctrine\Common\DataFixtures\Purger\ORMPurger;

$purger = new ORMPurger();
$executor = new ORMExecutor($em, $purger);
$executor->execute($loader->getFixtures());

如果要在加载前追加固定而不是清除,则将 true 传递给 execute 的第二个参数

$executor->execute($loader->getFixtures(), true);

固定之间共享对象

如果固定对象与其他固定有关系,现在可以轻松通过名称添加对该对象的引用,并在以后引用它以形成关系。以下是一个示例固定,用于 RoleUser 关系

namespace MyDataFixtures;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;

class LoadUserRoleData extends AbstractFixture
{
    public function load(ObjectManager $manager)
    {
        $adminRole = new Role();
        $adminRole->setName('admin');

        $anonymousRole = new Role();
        $anonymousRole->setName('anonymous');

        $manager->persist($adminRole);
        $manager->persist($anonymousRole);
        $manager->flush();

        // store reference to admin role for User relation to Role
        $this->addReference('admin-role', $adminRole);
    }
}

以及 User 数据加载固定

namespace MyDataFixtures;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;

class LoadUserData extends AbstractFixture
{
    public function load(ObjectManager $manager)
    {
        $user = new User();
        $user->setUsername('jwage');
        $user->setPassword('test');
        $user->setRole(
            $this->getReference('admin-role') // load the stored reference
        );

        $manager->persist($user);
        $manager->flush();

        // store reference of admin-user for other Fixtures
        $this->addReference('admin-user', $user);
    }
}

固定排序

注意 固定加载顺序很重要!为了手动处理它,实现以下接口之一

OrderedFixtureInterface

手动设置顺序

namespace MyDataFixtures;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;

class MyFixture extends AbstractFixture implements OrderedFixtureInterface
{
    public function load(ObjectManager $manager)
    {}

    public function getOrder()
    {
        return 10; // number in which order to load fixtures
    }
}

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

注意 排序与 Loader 类相关。

运行测试

需要 PHPUnit 3.5 或更高版本以及 Mock_Object 包。要设置和运行测试,请按照以下步骤操作

  • 前往 data-fixtures 的根目录
  • 运行: composer install --dev
  • 复制 phpunit 配置 cp phpunit.xml.dist phpunit.xml
  • 运行: phpunit