webgriffe / doctrine-fixtures-loader
此包的最新版本(dev-master)没有提供许可证信息。
使用Doctrine和闭包为您的项目对象固定值及其依赖项创建基本加载器。
dev-master
2013-11-28 16:46 UTC
Requires
- doctrine/common: >=2.1.0
- doctrine/data-fixtures: >=v1.0.0-ALPHA1
This package is auto-updated.
Last update: 2024-09-07 20:37:46 UTC
README
使用Doctrine和闭包为您的项目对象固定值及其依赖项创建基本加载器。
简介
在通常使用Doctrine的实际项目中,您有成千上万的实体相互关联,需要在功能测试中使用 doctrine/data-fixtures
库加载。此基本加载器可以帮助您维护一个项目固定值加载器,该加载器可以为调用者提供一个包含所有相关依赖项的对象实例。请参阅以下示例。
用法
假设您的项目具有以下实体
- 订单
- 产品
- 客户
假设对于每个订单,您有许多产品和一位客户。假设您需要一个加载特定支付方式的订单的固定值。假设您的应用程序要求订单必须设置所有依赖项。在这种情况下,您需要做的只是实例化一个订单,包含所有依赖项,如下所示
<?php
namespace MyProject\Tests\Fixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
class MyFixture extends AbstractFixture
{
public function load(ObjectManager $manager)
{
$customer = new Customer();
// set Customer's properties
$product1 = new Product();
// set Product's properties
$product2 = new Product();
// set Product's properties
$order = new Order();
$order->setProducts(array($product1, $product2));
$order->setCustomer($customer);
// set other Order's properties
$order->setPaymentMethod('my_specific_payment_method');
$manager->persist($order);
$manager->flush();
}
}
这没问题,但构建包含所有依赖项的订单的代码可能会在每个需要订单的固定值中重复。这在实际项目中尤其不方便,尤其是在具有更多实体和依赖项的项目中,因为当您需要订单时,您不希望担心所有依赖项;您只需要一个订单,以便为特定的测试案例设置特定的属性。
提出的解决方案是维护一个特定于项目的固定值加载器(该加载器扩展此基本加载器),如下所示
<?php
namespace MyProject\Tests\Fixtures;
use Webgriffe\DoctrineFixturesLoader\Loader as BaseLoader;
use MyProject\Entity\Order;
use MyProject\Entity\Customer;
use MyProject\Entity\Product;
class Loader extends BaseLoader
{
public function loadCustomer($referenceName = null, $forcePersist = true)
{
$objectLoader = function (
Loader $loader,
$referenceName
) {
$customer = new Customer();
// set Customer's properties
return $customer;
};
$this->load($referenceName, $forcePersist, $objectLoader, 'default-customer');
}
public function loadProduct($referenceName = null, $forcePersist = true)
{
$objectLoader = function (
Loader $loader,
$referenceName
) {
$product = new Product();
// set Product's properties
return $product;
};
$this->load($referenceName, $forcePersist, $objectLoader, 'default-product');
}
public function loadOrder($referenceName = null, $forcePersist = true)
{
$objectLoader = function (
Loader $loader,
$referenceName
) {
$order = new Order();
$order->setProducts(
array($loader->loadProduct(), $loader->loadProduct('another-product'))
);
$order->setCustomer($loader->loadCustomer());
// set other Order's properties
return $order;
};
$this->load($referenceName, $forcePersist, $objectLoader, 'default-order');
}
}
请注意,如果需要,您可以根据需要添加任何加载器方法。例如,在这里,我们可以添加一个 loadEmptyOrder()
方法,该方法创建一个没有产品的订单。因此,使用上述固定值加载器,之前的 MyFixture
变为如下所示
<?php
namespace MyProject\Tests\Fixtures;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\Persistence\ObjectManager;
use MyProject\Tests\Fixtures\Loader;
class MyFixture extends AbstractFixture
{
public function load(ObjectManager $manager)
{
$loader = new Loader($manager, $this->referenceRepository);
$order = $loader->loadOrder();
$order->setPaymentMethod('my_specific_payment_method');
$manager->flush();
}
}
这就完了。
鸣谢
此基本加载器由 Webgriffe® 开发。请通过GitHub问题报告任何错误或建议。