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