devtronic / injector
此包已被放弃,不再维护。没有建议的替代包。
为人类提供的服务容器
v1.2.1
2018-04-14 06:00 UTC
Requires
- php: >=5.6
- psr/container: ^1.0
Requires (Dev)
- phpunit/phpunit: 5.7
README
Injector
Injector 是一个依赖注入容器。
它快速、可靠且易于理解。
安装
$ composer require devtronic/injector
使用
注册服务
要注册服务,您必须调用 register
方法。
ServiceContainer::register($name, $service, $arguments = [])
参数 | 描述 | 示例 |
---|---|---|
name | 服务的唯一名称。 | app.my_service |
service | 可调用的服务。 | function($arg1) {} |
arguments | 服务的参数。带有 @-前缀的条目是服务引用 | ['@app.foo', 1] |
使用静态参数注册服务
由于并非所有服务都需要服务注入,参数数组也支持静态条目。
<?php use Devtronic\Injector\ServiceContainer; $serviceContainer = new ServiceContainer(); $serviceContainer->register('app.my_service', function ($name) { return 'Hello ' . $name; }, ['Your Name']); $serviceContainer->getRegisteredServices(); // Contains the registered Service
使用服务依赖注册服务
有时您需要在服务中需要另一个已注册的服务。在这种情况下,您可以通过带有 @-前缀的服务名称来引用它。递归地解决 (子) 依赖关系。
<?php use Devtronic\Injector\ServiceContainer; $serviceContainer = new ServiceContainer(); $serviceContainer->register('app.another_service', function () { return [ 'name' => 'injector', 'developer' => 'Julian', ]; }); $serviceContainer->register('app.my_service', function (array $anotherService) { return "Name: {$anotherService['name']}, developer: {$anotherService['developer']}"; }, ['@app.another_service']);
将类注册为服务
您还可以将类注册为服务。如果服务被加载,则构造函数会使用依赖项进行调用。
<?php use Devtronic\Injector\ServiceContainer; $serviceContainer = new ServiceContainer(); class Car { /** @var int */ public $maxSpeed = 0; /** @var string */ public $color = ''; public function __construct($maxSpeed, $color) { $this->maxSpeed = $maxSpeed; $this->color = $color; } } $serviceContainer->register('app.my_car', Car::class, [250, 'red']); $myCar = $serviceContainer->get('app.my_car'); echo "My Car: Speed: {$myCar->maxSpeed}, Color: {$myCar->color}"; // My Car: Speed: 250, Color: red
加载服务
要加载服务,您必须调用 loadService
方法。
一旦服务被加载,它将在运行时保留在内存中。当再次加载相同的服务时,将返回第一个实例。
ServiceContainer::loadService($name)
参数 | 描述 | 示例 |
---|---|---|
name | 服务的唯一名称。 | app.my_service |
<?php use Devtronic\Injector\ServiceContainer; $serviceContainer = new ServiceContainer(); $serviceContainer->register('app.another_service', function () { return [ 'name' => 'injector', 'developer' => 'Julian', ]; }); $serviceContainer->register('app.my_service', function (array $anotherService) { return "Name: {$anotherService['name']}, developer: {$anotherService['developer']}"; }, ['@app.another_service']); echo $serviceContainer->get('app.my_service'); // Name: injector, developer: Julian
添加参数
服务容器也支持静态参数。
您可以使用 addParameter
方法添加参数
ServiceContainer::addParameter($name)
参数 | 描述 | 示例 |
---|---|---|
name | 参数的唯一名称。 | database.host |
要将参数传递给服务,请在名称前后添加一个 '%': %name.of.the.parameter%
<?php use Devtronic\Injector\ServiceContainer; $serviceContainer = new ServiceContainer(); $serviceContainer->addParameter('database.host', 'localhost'); $serviceContainer->register('my.service', function ($hostname) { return 'Connecting to ' . $hostname; }, ['%database.host%']);
测试
$ phpunit
贡献
请随意进行分支并添加 pull-requests 🤓