runopencode/abstract-builder

实现构建器模式的简单原型类。

1.0.6 2017-03-24 07:26 UTC

This package is auto-updated.

Last update: 2024-09-17 10:01:47 UTC


README

Packagist Scrutinizer Code Quality Code Coverage Build Status Build Status

SensioLabsInsight

如果你打算在你的项目中使用构建器模式 (请参阅维基百科上的文章),你可以使用本库中构建器模式的原型实现。

为了做到这一点,你必须创建自己的构建器类,扩展 RunOpenCode\AbstractBuilder\AbstractBuilder 并实现方法 configureParametersgetObjectFqcn

对于那些特别懒惰的开发者,还有一个 RunOpenCode\AbstractBuilder\ReflectiveAbstractBuilder,它通过检查构造函数参数和默认值来实现 configureParameters 方法。

注意: 构建器类不得验证提供的参数。应该由要构建的类本身进行此类验证,因为任何类任何实例的构建过程都必须是有效的,无论是否使用了构建器实现。

实现示例

假设我们有一个名为 Message 的类,我们需要为其提供一个构建器类。下面是如何做到这一点

<?php

class Message
{
    private $id;
    private $message;
    private $timestamp;

    public function __construct($id, $message, $timestamp)
    {
        $this->id = $id;
        $this->message = $message;
        $this->timestamp = $timestamp;
    }
}

final class MessageBuilder extends \RunOpenCode\AbstractBuilder\AbstractBuilder
{
    /**
     * Get builded message.
     *
     * Alias to \RunOpenCode\AbstractBuilder\AbstractBuilder::build() method.
     *
     * @see \RunOpenCode\AbstractBuilder\AbstractBuilder::build()
     *
     * @return object
     */
    public function getMessage()
    {
        return $this->build();
    }

    /**
     * {@inheritdoc}
     */
    protected function configureParameters()
    {
        return array(
            'id' => null,
            'message' => null,
            'timestamp' => new \DateTime('now')
        );
    }

    /**
     * {@inheritdoc}
     */
    protected function getObjectFqcn()
    {
        return Message::class;
    }
}

构建器使用示例

首先创建一个构建器,你可以使用普通的构造函数

$builder = new MessageBuilder();

或者你可以使用一个静态方法来创建它

$builder = MessageBuilder::create();

你可以通过以下方式获取/设置每个单独配置的构建器属性

属性访问

$builder->id = 1;
$id = $builder->id;

设置方法

$builder->setId(1);
$id = $builder->getId();

数组访问

$builder['id'] = 1;
$id = $builder['id'];

通过数组访问多个属性

$builder->fromArray([ 'id' => 1, 'message' => 'Some message' ]);
$allProperties = $builder->toArray();
$someProperties = $builder->toArray([ 'id', 'message' ]);

最后,你可以通过调用 build() 方法或将构建器作为方法调用来构建具体对象

$message = $builder->build();
$message = $builder();

链式调用(流畅接口)

支持设置方法的流畅接口,因此你可以链式调用它们,例如

$message = MessageBuilder::create()
                ->setId(1)
                ->setMessage('Some message')
                ->setTimestamp(new \DateTime('now'))
                ->build();