adlacruzes / php-factory
生成具有默认值的类和数组的工厂
1.4.0
2021-11-04 11:23 UTC
Requires
- php: ^7.2 || ^8.0
- adlacruzes/php-base-exception: ^2
Requires (Dev)
- ergebnis/composer-normalize: ^2.15.0
- friendsofphp/php-cs-fixer: ^v3.2.1
- phpstan/phpstan: ^1.0.2
- phpstan/phpstan-phpunit: ^1.0.0
- phpstan/phpstan-strict-rules: ^1.0.0
- phpunit/phpunit: ^8.5.21 || ^9.5.10
README
PHP Factory 允许生成具有默认值的类和数组,并减少测试冗余。
此库的主要目的是帮助创建测试和固定数据。
目录
要求
PHP 需要是至少 PHP 7.2 版本。
安装
推荐的安装方法是使用 Composer。
composer require adlacruzes/php-factory
工厂
每个工厂都必须扩展 Adlacruzes\Factory\Factory
以获得所需的方法。
数组工厂
数组工厂允许生成具有预定义值的数组。
use Adlacruzes\Factory\Factory; use Adlacruzes\Factory\Factories\ArrayFactory; use Adlacruzes\Factory\Factories\FactoryInterface; class ArraysFactory extends Factory { protected static function setFactory(): FactoryInterface { return new ArrayFactory( [ 'one' => 'one', 'two' => 'two', 'three' => 'three', 'four' => 'four', ] ); } }
您可以调用 ArraysFactory::create()
并获取定义的数组
[ 'one' => 'one', 'two' => 'two', 'three' => 'three', 'four' => 'four', ]
如果需要更改一些信息,可以使用新的部分数组覆盖值
ArraysFactory::create( [ 'four' => 'another number' ] );
返回的数组将是
[ 'one' => 'one', 'two' => 'two', 'three' => 'three', 'four' => 'another number', ]
类工厂
类工厂允许生成具有默认构造函数参数的具体类。
class ValidClass { private $id; private $name; private $isEnabled; private $createdAt; public function __construct($id, $name, $isEnabled, \DateTime $createdAt) { $this->id = $id; $this->name = $name; $this->isEnabled = $isEnabled; $this->createdAt = $createdAt; }
创建一个继承自 Factory 的类。
use Adlacruzes\Factory\Factories\ClassFactory; use Adlacruzes\Factory\Factories\FactoryInterface; use Adlacruzes\Factory\Factory; class ValidClassFactory extends Factory { protected static function setFactory(): FactoryInterface { return new ClassFactory( ValidClass::class, [ 'id' => 1, 'name' => 'name', 'isEnabled' => true, 'createdAt' => new \DateTime(), ] ); } }
您可以使用 ValidClassFactory::create()
调用并获取定义的类
class ValidClass (4) { private $id => int(1) private $name => string(4) "name" private $isEnabled => bool(true) private $createdAt => class DateTime (3) { public $date => string(26) "2019-01-01 00:00:00.000000" public $timezone_type => int(3) public $timezone => string(3) "UTC" } }
如果需要更改一些信息,可以使用新的部分数组覆盖默认值
ValidClassFactory::create( [ 'name' => 'other', 'isEnabled' => false ] );
返回的类将是
class ValidClass (4) { private $id => int(1) private $name => string(4) "other" private $isEnabled => bool(false) private $createdAt => class DateTime (3) { public $date => string(26) "2019-01-01 00:00:00.000000" public $timezone_type => int(3) public $timezone => string(3) "UTC" } }
方法
每个工厂都有三种方法。它们可以不带参数调用,也可以接收一个值数组来覆盖默认参数。
create
create 返回工厂的实例。
create()
返回预定义的工厂。
SampleFactory::create();
create(array)
返回具有新指定值的预定义工厂。
SampleFactory::create( [ 'field' => 'value' ] );
create array
CreateArray 返回工厂实例的数组。实例的数量可以指定为第一个参数。默认数量为一个是。
createArray()
返回一个预定义工厂的数组。
SampleFactory::createArray();
createArray(n)
返回 n
个预定义工厂的数组。
SampleFactory::createArray(n);
createArray(n, array)
返回 n
个具有新指定值的预定义工厂的数组。
SampleFactory::create( n, [ 'field' => 'value' ] );
create nullable
CreateNullable 返回一个包含所有可能为 null 值的工厂实例。
createNullable()
返回具有 null 的预定义工厂。
SampleFactory::createNullable();
createNullable(array)
返回除新指定值之外的所有可能为 null 值的预定义工厂。
SampleFactory::createNullable( [ 'field' => 'value' ] );
异常
当覆盖默认值的参数不是原始工厂的一部分时,将抛出 FactoryException
。
例如
class ArraysFactory extends Factory { protected static function setFactory(): FactoryInterface { return new ArrayFactory( [ 'one' => 'one', 'two' => 'two', 'three' => 'three', 'four' => 'four', ] ); } } ArraysFactory::create( [ 'five' => 'five' ] );
Factory: invalid fields: five