Doctrine Data Fixtures Extension

Doctrine2 ORM Data Fixtures 扩展。(Doctrine2 ORM Data Fixtures Extensions)

Github星跟踪图

Doctrine Data Fixtures 扩展

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

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\UserDataLoader;

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

您也可以从目录加载一组fixtures:

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

或者你可以从文件中加载一组fixtures:

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

您可以使用getFixtures()方法获得添加的fixtures:

 $fixtures = $loader->getFixtures();

现在您可以轻松执行fixtures:

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

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

如果您想在装载前附加fixtures而不是清除,请传递true 到执行的第二个参数:

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

在fixtures间共享对象

如果fixtures对象与其他fixtures有关系,现在可以轻松地按名称添加对该对象的引用,并稍后将其引用以形成 一个关系。以下是 角色用户关系的示例装置

namespace MyDataFixtures;

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

class UserRoleDataLoader 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);
    }
}

用户数据加载fixtures:

namespace MyDataFixtures;

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

class UserDataLoader 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);
    }
}

Fixture 订购

注意Fixture 加载顺序很重要!手动处理实施以下接口之一:

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

提供一个Fixture类名称数组:

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
  • 运行:vendor/bin/phpunit

主要指标

概览
名称与所有者doctrine/data-fixtures
主编程语言PHP
编程语言PHP (语言数: 1)
平台BSD, Linux, Mac, Windows
许可证MIT License
所有者活动
创建于2010-09-20 21:28:26
推送于2025-04-28 22:24:35
最后一次提交
发布数40
最新版本名称2.0.2 (发布于 2025-01-21 13:22:12)
第一版名称v1.0.0-ALPHA1 (发布于 2012-01-25 22:53:15)
用户参与
星数2.8k
关注者数26
派生数226
提交数635
已启用问题?
问题数156
打开的问题数34
拉请求数259
打开的拉请求数12
关闭的拉请求数106
项目设置
已启用Wiki?
已存档?
是复刻?
已锁定?
是镜像?
是私有?

Doctrine Data Fixtures Extension

Build Status

This extension aims to provide a simple way to manage and execute the loading of data fixtures
for the Doctrine ORM or ODM. You can write fixture classes
by implementing the Doctrine\Common\DataFixtures\FixtureInterface interface:

namespace MyDataFixtures;

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

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

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

Now you can begin adding the fixtures to a loader instance:

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

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

You can load a set of fixtures from a directory as well:

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

Or you can load a set of fixtures from a file:

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

You can get the added fixtures using the getFixtures() method:

$fixtures = $loader->getFixtures();

Now you can easily execute the fixtures:

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

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

If you want to append the fixtures instead of purging before loading then pass true
to the 2nd argument of execute:

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

Sharing objects between fixtures

In case if fixture objects have relations to other fixtures, it is now possible
to easily add a reference to that object by name and later reference it to form
a relation. Here is an example fixtures for Role and User relation

namespace MyDataFixtures;

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

class UserRoleDataLoader 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);
    }
}

And the User data loading fixture:

namespace MyDataFixtures;

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

class UserDataLoader 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);
    }
}

Fixture ordering

Notice that the fixture loading order is important! To handle it manually
implement one of the following interfaces:

OrderedFixtureInterface

Set the order manually:

namespace MyDataFixtures;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\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

Provide an array of fixture class names:

namespace MyDataFixtures;

use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\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)
    {}
}

Notice the ordering is relevant to Loader class.

Running the tests:

Phpunit is included in the dev requirements of this package.

To setup and run tests follow these steps:

  • go to the root directory of data-fixtures
  • run: composer install --dev
  • run: vendor/bin/phpunit