arhone / builder
构建和部署依赖库的库 (PHP 7)
Requires
- php: ^7.0
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)
连接
-
使用composer安装包或从github下载
composer require arhone/builder
-
使用自动加载器连接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, // Клонировать объекты или нет, если это не указано в инструкциях ]);