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