kelunik/builders

生成值对象的构建器。

v2.0.0 2019-06-18 22:11 UTC

This package is auto-updated.

Last update: 2024-09-06 07:48:17 UTC


README

此包允许自动生成值对象的构建器。一个用例是创建单元测试和集成测试的测试对象。

安装

composer require kelunik/builders

用法

给定以下User对象,构建器生成器将生成一个UserBuilderMethods类。

<?php

namespace Example;

class User
{
    /** @var int|null */
    private $id;
    /** @var string|null */
    private $name;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function setId(?string $id): void
    {
        $this->id = $id;
    }

    public function getName(): ?string
    {
        return $this->name;
    }

    public function setName(?string $name): void
    {
        $this->name = $name;
    }
}
<?php

namespace Example;

use Example;

class UserBuilderMethods implements \Kelunik\Builders\Builder
{
    private $entity;

    public function __construct()
    {
        $this->entity = new Example\User;
    }

    final public function withId(?string $value)
    {
        $this->entity->setId($value);

        return $this;
    }

    final public function withName(?string $value)
    {
        $this->entity->setName($value);

        return $this;
    }

    final public function build(): Example\User
    {
        return $this->entity;
    }
}

自定义构建器方法

为了使用生成的类,建议创建一个扩展生成的UserBuilderMethodsUserBuilder对象。这种分离允许你在不影响构建器生成器(当它丢弃旧的UserBuilderMethods并生成一个新的)时添加自定义构建器方法。

<?php

namespace Example;

class UserBuilder extends UserBuilderMethods
{
    public function root()
    {
        return $this->withId(1)->withName('root');
    }
}

构建器消费

如果添加一个定义函数为快捷方式的builders.php,构建测试对象将变得非常容易。

<?php

namespace Example;

function user() {
    return new UserBuilder;
}
<?php

use Example\User;
use function Example\user;

require __DIR__ . '/../vendor/autoload.php';

$user = a(user()->root()->withName('kelunik'));

var_dump($user instanceof User);
var_dump($user);

代码生成

可以使用以下命令调用代码生成器,路径相对于composer根目录:

vendor/bin/builder-generator App\NamespaceOfValueObjects src src-generated