adlacruzes/php-factory

生成具有默认值的类和数组的工厂

1.4.0 2021-11-04 11:23 UTC

This package is auto-updated.

Last update: 2024-09-26 15:50:09 UTC


README

Minimum PHP Version Packagist Github actions

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