devtronic/injector

此包已被放弃,不再维护。没有建议的替代包。

为人类提供的服务容器

v1.2.1 2018-04-14 06:00 UTC

This package is auto-updated.

Last update: 2021-08-07 20:34:36 UTC


README

Travis Packagist GitHub license Packagist

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 🤓