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