phetit/container

此包已被废弃且不再维护。作者建议使用phetit/dependency-injection包代替。

简单的PHP依赖注入容器

v0.7.0 2023-07-27 02:01 UTC

This package is auto-updated.

Last update: 2023-08-01 00:31:00 UTC


README

GitHub release (latest SemVer) Packagist Packagist PHP Version tests GitHub

Phetit Container

一个简单的PHP依赖注入容器。

此包是PSR-11容器接口的实现,并遵循语义版本控制规范。

安装

您可以使用composer进行安装

composer require phetit/dependency-injection

用法

创建一个ContainerBuilder类的实例。

use Phetit\DependencyInjection\ContainerBuilder;

$container = new ContainerBuilder();

注册服务

您可以使用register($id, $resolver)方法注册服务,并传递id(字符串)和resolver(一个闭包)。

$container->register('foo', fn() => 'bar');

获取服务

您可以使用get($id)方法检索已注册的服务

$foo = $container->get('foo');
// $foo === 'bar'

非共享服务

默认情况下,所有服务都是共享的。这意味着只有在第一次调用get($id)方法时才会解析服务。所以,在随后的调用中,您将得到相同的对象。

$container->register('service', fn() => new Service());

$serviceOne = $container->get('service'); // Service object
$serviceTwo = $container->get('service'); // Service object

// $serviceOne === $serviceTwo => true

为了在每次调用时获得一个新实例,您需要使用factory()方法

$container->factory('service', fn() => new Service());

$serviceOne = $container->get('service'); // Service object
$serviceTwo = $container->get('service'); // Service object

// $serviceOne === $serviceTwo => false

参数

您可以使用parameter()方法注册参数

$container->parameter('foo', 'bar');
$container->parameter('closure', fn() => new Service());

$container->get('foo'); // 'bar'

// Parameters are not resolved
$closure = $container->get('closure'); // $closure = fn() => new Service()
$service = $closure(); // 'Service object'

从服务中访问容器

容器对象注入到服务解析器中,因此您可以访问容器中定义的其他条目

$container->parameter('db_dns', 'mysql:dbname=testdb;host=127.0.0.1');
$container->parameter('db_user', 'dbuser');
$container->parameter('db_pass', 'dbpass');

$container->register('db', fn(Container $c) => new PDO(
    $c->get('db_dns'),
    $c->get('db_user'),
    $c->get('db_pass'),
));

贡献

有关信息,请参阅CONTRIBUTING

许可证

MIT