berlioz / service-container
Berlioz Service Container 是一个遵守 PSR-11(容器接口)标准的 PHP 库,用于通过依赖注入管理您的服务。
Requires
- php: ^8.0
- psr/container: ^1.0 || ^2.0
- psr/simple-cache: ^1.0 || ^2.0 || ^3.0
Requires (Dev)
- phpunit/phpunit: ^9.3
Provides
- psr/container-implementation: ^1.0 || ^2.0
This package is auto-updated.
Last update: 2024-08-26 11:38:59 UTC
README
Berlioz Service Container 是一个遵守 PSR-11(容器接口)标准的 PHP 库,用于通过依赖注入管理您的服务。
有关更多信息,以及 Berlioz 框架的使用,请访问网站和在线文档:https://getberlioz.com
安装
Composer
您可以使用 Composer 安装 Berlioz Service Container,这是推荐的安装方式。
$ composer require berlioz/service-container
依赖项
- PHP ^8.0
- 包
- psr/container
- psr/simple-cache
使用方法
容器
PSR-11 提供的方法
-
get($id)
PSR-11:通过标识符查找容器中的条目并返回它。
接受一个类名。
-
has($id)
PSR-11:如果容器可以为给定的标识符返回条目,则返回 true。否则返回 false。
添加服务
您可以使用 Container::add()
方法添加服务。
use Berlioz\ServiceContainer\Container; $container = new Container(); $service = $container->add(MyService::class, 'alias'); // Returns a Berlioz\ServiceContainer\Service\Service object
或者使用方法 Container::addService()
,它接受一个 Service
对象。
use Berlioz\ServiceContainer\Container; use Berlioz\ServiceContainer\Service\Service; $container = new Container(); $service = new Service(MyService::class, 'alias'); $container->addService($service);
服务对象
-
Service::public function __construct( string|object $class, ?string $alias = null, callable|string|null $factory = null, ?CacheStrategy $cacheStrategy = null, )
服务对象的构造函数。
-
Service::setNullable(bool $nullable = true): Service
服务可以在工厂执行后为 null(默认为 false)。
-
Service::setShared(bool $shared = true): Service
共享服务,总是返回相同的实例。
-
Service::addProvide(string ...$provide): Service
通过服务添加提供的类/接口/别名。
-
Service::addArgument(string $name, mixed $value): Service
添加参数以创建服务类实例。
-
Service::addArguments(array $arguments): Service
它是一个参数数组,键必须是参数名称,键的值必须是参数值。
-
Service::addCall(string $method, array $arguments = []): Service
在对象类构造后立即调用的方法(及其参数)。
-
Service::addCalls(array $calls = []): void
它是一个调用数组,键必须是调用的方法名称,值是一个参数数组。
-
Service::setFactory(string $factory): Service
这是用于创建对象的工厂静态方法。
示例:
MyProject\Name\Space\MyFactory::service
实例化器
创建类或对象的新实例
use Berlioz\ServiceContainer\Instantiator; $instantiator = new Instantiator(); $object = $instantiator->newInstanceOf( MyClass::class, [ 'argument1' => 'Value', 'argument3' => 'Value', 'argument2' => 'Value' ] );
调用方法
use Berlioz\ServiceContainer\Instantiator; $instantiator = new Instantiator(); $instantiator->invokeMethod( $myObject, 'myMethodName', [ 'argument1' => 'Value', 'argument3' => 'Value', 'argument2' => 'Value' ] );
调用函数
use Berlioz\ServiceContainer\Instantiator; $instantiator = new Instantiator(); $instantiator->invokeFunction( 'myFunctionName', [ 'argument1' => 'Value', 'argument3' => 'Value', 'argument2' => 'Value' ] );
在所有示例中,最后一个参数是传递给构造函数、方法或函数的参数数组。参数的顺序不重要。
如果参数是对象,系统将将其放入容器或尝试实例化该类。
方法 Container::call()
根据值调用实例化器的正确方法。
use Berlioz\ServiceContainer\Container; $container = new Container(); $container->call(fn() => 'test'); // Call closure $container->call(MyClass::class); // Instantiate the class $container->call(MyClass::method); // Call static method or instantiate the class and call method
Inflector
如果您想通过实现接口的方法注入一些依赖项,那么 Inflector 是非常有用的。
use Berlioz\ServiceContainer\Container; use Berlioz\ServiceContainer\Inflector\Inflector; $inflector = new Inflector( MyInterface::class, // Interface implemented by object 'setFoo', // Method to call [/*...*/] // Arguments ); $container = new Container(); $container->addInflector($inflector);
服务提供者
在某些情况下,例如性能限制,您需要添加一个服务提供者。
服务提供者需要实现 \Berlioz\ServiceContainer\Provider\ServiceProviderInterface
接口。抽象类 \Berlioz\ServiceContainer\Provider\AbstractServiceProvider
可以帮助您。
服务提供者的示例
use Berlioz\ServiceContainer\Container; use Berlioz\ServiceContainer\Provider\AbstractServiceProvider; class MyServiceProvider extends AbstractServiceProvider { // Declare services class and alias protected array $provides = [stdClass::class, 'service']; public function boot(Container $container) : void { // This method is called when provider is added to container. // Add inflectors here. } public function register(Container $container) : void { // Add services here $container->add(stdClass::class, 'service'); } }
添加您的服务提供者
use Berlioz\ServiceContainer\Container; $container = new Container(); $container->addProvider(new MyServiceProvider()); $container->has('service'); // Returns TRUE $container->get('service'); // Returns an `stdClass` instance