arhone/builder

构建和部署依赖库的库 (PHP 7)

1.0.3 2017-12-11 18:31 UTC

This package is not auto-updated.

Last update: 2024-09-29 02:13:52 UTC


README

构建器 - 构建器 - 依赖部署 (PHP 7)

描述

Builder根据指定指令收集对象。

用于构建对象并管理其依赖项。

可以作为依赖注入容器 (DIC) 或服务定位器使用。

与DIC不同的是,Builder在构建包时可以调用对象的方法链,传递依赖项到这些方法中,设置对象的属性等。

Builder和服务定位器一样,可以用于本地类中,通过别名获取对象,或者根据指令进行构建

<?php
use arhone\construction\builder\Builder;

class Alias {

    public function get () {

        return 'test';

    }

}

$builder = new Builder();

$builder->instruction([
    'Alias' => [
        'class' => 'Alias'
    ]
]);

/**
 * @var $alias \Alias
 */
$alias = $builder->make('Alias');
echo $alias->get();

例如:

<?php
use arhone\construction\builder\Builder;

$builder = new Builder();

$builder->instruction([
    'Alias' => [
        'class' => 'ClassNameAlias'
    ]
]);

$object = $builder->make([
    'class' => 'ClassName',
    'construct' => [
        ['Alias'],
        [
            'class' => 'ClassName2'
        ]
    ],
    'method' => [
        'config' => [
            [
                'array' => $config
            ]
        ]
    ]
]);

创建ClassName类的对象,将别名传递给构造函数,创建并传递ClassName2给构造函数,将配置数组config传递给ClassName->config($config)

连接

  1. 使用composer安装包或从github下载 composer require arhone/builder

  2. 使用自动加载器连接Builder

<?php
use arhone\construction\builder\Builder;
include 'vendor/autoload.php';

$builder = new Builder();

可以使用"instruction"方法传递/扩展指令

$builder->instruction(include 'config/builder/instruction1.php');
$builder->instruction(include 'config/builder/instruction2.php');

默认情况下,config/builder/instruction.php将返回一个包含指令的数组,如下所述

<?php
return [
    'Alias1' => [
        'class' => 'ClassName1'
    ],
    'Alias2' => [
        'class' => 'ClassName2'
    ]
];

构建指令

指令按"别名 => 指令"的格式构建。

通过"别名",您可以基于其指令请求构建。

Builder理解几种类型的指令

1) class

在类构建指令中可以指定以下规则

<?php
return [
    'Alias' => [
        'require' => 'path/ClassName.php', // Может подключить ваш класс, если у вас нет автозагрузчика под него
        'class' => 'ClassName', // Класс, который вы хотите собрать
        'construct' => [
            ['Alias2'], // Передаст "Alias2" в конструктор класса
            [
                'class' => 'ClassName3'
            ] // Создаст и передаст ClassName3 в конструктор класса
        ],
        'property' => [
            'name1' => 'value',
            'name2' => 'value'
        ], // Задаст значения свойствам
        'method' => [
            'config' => [
                'argument' => [
                    [
                        'array' => $config
                    ]    
                ], // Аргументы метода. Так же как в construct
                'chain' => true // Вернёт результат этого метода
            ] // Запустит метод config с переданным массивом $config в качестве аргумента
        ],
        'new' => true, // В этом случае Builder всегда будет возвращать новый экземпляр класса
        'clone' => true // Будет возвращать клонированный экземпляр. clone true/false работает только если new == false
    ]
];
关于方法chain参数的详细信息

有时需要将类包装在某种包装器中,例如代理或装饰器,

例如,根据情况从两个类中选择一个。

在这种情况下,对类的访问不是直接进行的,而是通过返回对象的方法,通常称为getInstance。

Builder允许在指令中指定方法链。如果getInstance指定了chain => true参数,那么将返回此方法的结果。

<?php
class Test {

    public $text = 0;
    public function one () {

        $this->text = 1;
        return $this;

    }

    public function two () {

        $this->text = 2;
        return $this;

    }

    public function result () {

        return $this->text;

    }

}

echo $builder->make([
    'class' => 'Test',
    'method' => [
        'one' => [
            'chain' => true
        ],
        'two' => [
            'chain' => true
        ],
        'result' => [
            'chain' => true // Если поставить false, вернёт не 2 а то, что вернул метод two, то есть объект Test
        ]
    ]
]); // Вернёт 2
2) callback
<?php
return [
    'myFunc' => [
        'callback' => function ($name) {
            return 'Привет ' . $name;
        },
        'argument' => [
            [
                'string' => 'Вася'
            ]
        ]
    ]
];
<?php
echo $builder->make('myFunc');

对于callback类型指令,Builder将返回其结果。使用"argument"键可以指定执行函数时所需的依赖项集合。如果您想返回函数而不是其执行结果,请指定类型"callable"。Builder不会处理"callable"类型,因此它将直接返回现有内容。因此,"callable"类型仅用于可读性,但您可以根据需要将其命名为其他名称,例如"myFunc"。

<?php
return [
    'myFunc' => [
        'callable' => function ($name) {
            return 'Привет ' . $name;
        }
    ]
];
<?php
$myFunction = $builder->make('myFunc');
echo $myFunction('Вася');

请注意,您可能需要缓存设置,例如在Redis中,在这种情况下,callback和callable将不起作用,因为缓存不存储逻辑。

在这种情况下,可以使用include类型

4) include
<?php
return [
    'myArray' => [
        'include' => __DIR__ . '/config.php'
    ]
];

构建此指令时,Builder将返回执行文件的输出。

5) array, object, integer, float, bool
<?php
return [
    'myArray' => [
        'array' => [1,2,3]
    ]
];

这些类型主要为了直观,但Builder会将您的数据转换为这些类型。

<?php
return [
    'myArray' => [
        'array' => 'строка'
    ] // Вернёт массив ['строка']. Равносильно (array)'строка';
];

如果您不需要类型转换,请指定自己的类型。例如,可以添加下划线_string或其他分隔符。

<?php
return [
    'myArray' => [
        'array|string' => include 'data.php' // include возвращает return 'строка'; а может быть и return ['массив'];
    ] // Ваш выдуманный тип. Ещё варианты что бы вы не думали (data, other, unknown)
];

对于"object"类型,可以使用"clone"如类示例中所示。如果clone == false,对象将通过引用提供,就像普通对象一样,不进行克隆。

6) alias

可以将另一个指令作为指令传递

<?php
return [
    'Alias1' => [
        'class' => 'ClassName'
    ],
    'Alias2' => [
        'alias' => 'Alias1'
    ],
    'Alias3' => ['Alias2'] // У типа "alias" есть сокращённая форма. Вы просто не указываете тип, по умолчанию это будет "alias"
];
7) instruction
<?php
return [
    'Alias' => [
        'instruction' => include 'vendor/name/Alias/config/builder/instruction.php'
    ]
];

类型 "instruction" 允许引用超出您责任范围的指令。例如,这可能是指由您开发的库之外的库的指令。库的开发者会放置其构建指令,而您只需将其连接即可。

<?php
return [
    'Alias' => include 'vendor/name/Alias/config/builder/instruction.php' // Тоже самое
];

vendor/name/Alias/config/builder/instruction.php

<?php
return [
    'class' => 'ClassName'
];

配置 Builder 类

该类有默认设置

<?php
use arhone\construction\builder\Builder;
include 'vendor/autoload.php';

$builder = new Builder([
    'new'   => false, // Создавать новый экземпляр класса или нет, если это не указано в инструкциях
    'clone' => true, // Клонировать объекты или нет, если это не указано в инструкциях
]);