rafaeltovar/php-service-manager
Composer 安装命令:
composer require rafaeltovar/php-service-manager
包简介
Simple, light, minimum service manager and dependency injection for PHP.
README 文档
README
Simple, light, minimum service manager and dependency injection for PHP.
Installation
Composer
Execute:
composer require rafaeltovar/php-service-manager
Features
- Dependency injection
- Service container
- Providers
- Singleton strategy
- Initialized only if service is called
- Alias
Documentation
Service container
The service container is the main service controller for manage the service queue.
// myproject.php use MyServiceAProvider; $serviceContainer = new \ServiceManager\ServiceContainer( [MyServiceAProvider::class] );
Service Providers
This is my service.
// MyServiceA.php class MyServiceA { public function test() { echo "Working."; } }
This is my service provider.
// MyServiceAProvider.php class MyServiceAProvider extends \ServiceManager\ServiceProvider { /** * This method return the service class name (mandatory) **/ public function getServiceType() : string { return MyServiceA::class; } /** * This method return the identification of the service * into Service Container (mandatory) **/ public function getServiceId(): string { return "my-service-a"; } /** * This method return the service (mandatory) **/ public function getService() { return new MyServiceA(); } }
Passing custom arguments to the provider
Sometimes We need pass some arguments to the provider for initialize the service, like the config or logger, for example. In this case we need implements \ServiceManager\ServiceProviderArgumentsInterface.
MyCustomArguments will have the arguments it needs.
// myproject.php use MyServiceDebugProvider, MyServiceAProvider; use MyCustomArguments; //... $serviceContainer = new \ServiceManager\ServiceContainer( [ MyServiceAProvider::class, MyServiceDebugProvider::class ], [], new MyCustomArguments($myLogger) );
// MyCustomArguments.php class MyCustomArguments implements \ServiceManager\ServiceProviderArgumentsInterface { protected $logger; public function __construct(\Psr\Log\LoggerInterface $logger) { $this->logger = $logger; } public function getLogger() : \Psr\Log\LoggerInterface { return $this->logger; } }
My example service with argument:
// MyServiceDebug.php class MyServiceDebug { protected $logger; public function __construct(\Psr\Log\LoggerInterface $logger) { $this->logger = $logger; } public function write(string $text) { $this->logger->debug($text); } }
My example service provider:
// MyServiceDebugProvider.php class MyServiceDebugProvider extends \ServiceManager\ServiceProvider { public function getServiceType() : string { return MyServiceDebug::class; } public function getServiceId(): string { return "debug"; } public function getService() { $logger = $this->getProviderArguments()->getLogger(); return new MyServiceDebug($logger); } }
Getting a service
$serviceContainer->get("my-service-a")->test();
// result:
Working.
Dependency injection
// MyController.php class MyController { protected $a; public function __construct(MyServiceA $a) { $this->a = $a; } public function test() { $this->a->test(); } }
use MyController; //... $myCtrl = $serviceContainer->build(MyController::class); $myCtrl->test();
// result:
Working.
Custom builders
Sometime our controller need other controller or data, not a service. In those cases we can create a custom constructor implements ControllerBuilderCreateInterface.
// MyController.php use ServiceManager\ServiceContainer, ServiceManager\ControllerBuilderCreateInterface; class MyController implements ControllerBuilderCreateInterface { protected $public; public function __construct(string $publicFolder) { $this->public = $publicFolder; } public static function create(ServiceContainer $services) { return new MyController( $services->get('config')->get("PUBLIC_FOLDER") ); } }
Now we can build our controller. The service container will call to create method if implements ControllerBuilderCreateInterface.
use MyController; //... $myCtrl = $serviceContainer->build(MyController::class);
Alias
Other times we need to work with interfaces, we can use aliases to obtain the services that implement these interfaces.
// myproject.php use MyServiceDebugProvider, MyServiceAProvider; use MyCustomArguments; //... $serviceContainer = new \ServiceManager\ServiceContainer( [ MyLoggerProvider::class, ], [ // aliases // interface => service id \Psr\Log\LoggerInterface::class => "logger" ] );
// MyServiceDebugProvider.php use Monolog\Logger; use Monolog\Handler\StreamHandler; class MyLoggerProvider extends \ServiceManager\ServiceProvider { public function getServiceType() : string { return Logger::class; } public function getServiceId(): string { return "logger"; } public function getService() { $log = new Logger('name'); $log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); return $log; } }
Now we can build our controller with interface dependency.
// MyController.php class MyController { protected $logger; public function __construct(\Psr\Log\LoggerInterface $logger) { $this->logger = $logger; // this logger will be \Monolog\Logger } // ... }
use MyController; //... $myCtrl = $serviceContainer->build(MyController::class);
rafaeltovar/php-service-manager 适用场景与选型建议
rafaeltovar/php-service-manager 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 6.46k 次下载、GitHub Stars 达 1, 最近一次更新时间为 2019 年 02 月 11 日, 在 PHP 生态内属于活跃度较高的组件。
我们在过去多个企业项目中使用过 rafaeltovar/php-service-manager 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 rafaeltovar/php-service-manager 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
统计信息
- 总下载量: 6.46k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 1
- 点击次数: 8
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2019-02-11