phetit / dependency-injection
一个简单的PHP依赖注入容器
v0.7.0
2023-07-27 02:01 UTC
Requires
- php: ^8.1
- psr/container: 1.1|^2.0
Requires (Dev)
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.5
- phpunit/phpunit: ^10.2
- squizlabs/php_codesniffer: ^3.7
Provides
- psr/container-implementation: 1.1|2.0
README
Phetit 容器
一个简单的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。