anteris-dev/data-transfer-object-factory

为模拟数据传输对象提供易于使用的API。

v1.0.0 2021-04-22 13:49 UTC

README

Tests Style

此包提供了一个用于数据传输对象的流畅工厂。原生支持POPOs(普通的PHP对象)、getter / setter对象,以及Spatie的数据传输对象。如果存在未表示的DTO,您可以轻松添加适配器以支持它。

此包强大的一个特点是它集成了Faker,旨在根据其名称智能地生成数据的内容。例如,具有属性"$firstName"的DTO将获取一个Faker名字。

默认情况下,仅支持内置PHP类型,但此工厂可以轻松扩展以支持其他类型(例如Carbon)。

安装

运行 composer require anteris-dev/data-transfer-object-factory

入门

如果您只是在使用DTO中使用PHP默认类型,您可以直接开始。只需将您的DTO FQDN传递给静态new()方法。然后,您可以使用以下任何辅助方法。

  • count() - 允许您指定要生成的DTO数量。它们将作为数组返回。
  • make() - 当您准备好生成DTO时调用。返回生成的DTO[s]。
  • random() - 生成随机数量的DTO。
  • sequence() - 交替特定状态。(见下文)
  • state() - 根据传递的值数组手动设置属性。

以下是一些这些方法的示例。

use Anteris\DataTransferObjectFactory\Factory;

// Creates one DTO
Factory::new(PersonData::class)->make();

// Creates two DTOs in an array
Factory::new(PersonData::class)->count(2)->make();

// Sets the first name of every person to "Jim"
Factory::new(PersonData::class)
    ->random()
    ->state([
        'firstName' => 'Jim',
    ])
    ->make();

// Also sets the first name of every person to "Jim"
Factory::dto(PersonData::class)
    ->random()
    ->make([
        'firstName' => 'Jim',
    ]);

// Alternates the names of each person between "Jim" and "Susie"
Factory::dto(PersonData::class)
    ->random()
    ->sequence(
        [ 'firstName' => 'Jim' ],
        [ 'firstName' => 'Susie' ]
    )
    ->make();

扩展

适配器

适配器指导工厂如何检索特定类型类的属性。适配器必须实现Anteris\DataTransferObjectFactory\Adapter\AdapterInterface,它需要以下方法。

  • handles(ReflectionClass $class) - 返回一个布尔值,表示适配器是否可以处理引用的反射类。
  • getProperties(ReflectionClass $class) - 返回在引用的反射类上找到的属性集合。
  • createClass(ReflectionClass $class, PropertyCollection $collection) - 使用传递的属性创建并返回反射类的实例。

要在工厂上注册适配器,请调用其静态registerAdapter()方法。例如

use Anteris\DataTransferObjectFactory\Factory;

Factory::registerAdapter(new MyCustomAdapter);

有关更多信息,请参阅源代码中的Adapter目录。

属性类型

过去,您必须扩展工厂类才能利用自定义类型。现在,您可以通过在PropertyFactory类上使用静态registerProvider()方法来完成此操作。此方法接受两个参数。第一个应该是您提供的类的FQDN(例如Carbon\Carbon)或内置类型(例如string)。第二个应该是一个回调,该回调返回生成的值。当调用时,此回调会传递两个属性以帮助生成值。第一个是Anteris\FakerMap\FakerMap的实例,可用于帮助生成假数据。第二个是正在生成的属性的名称或null(如果没有提供)。

例如,要支持Carbon

use Anteris\DataTransferObjectFactory\PropertyFactory;

use Anteris\FakerMap\FakerMap;

PropertyFactory::registerProvider('Carbon\Carbon', fn(FakerMap $fakerMap) => Carbon::parse(
    $fakerMap->closest('dateTime')->fake()
));