hprotravel / composer-service-handler
用于从类注解生成服务定义的Composer脚本处理器
v1.3.0
2024-01-30 13:51 UTC
Requires
- php: >=8.1
- doctrine/annotations: ^2.0
- symfony/finder: ^6.4|^7.0
- symfony/yaml: ^6.4|^7.0
Requires (Dev)
- composer/composer: ^2.0
- phpspec/prophecy-phpunit: ^2.1
- phpunit/phpunit: ^10.5
README
基于Symfony注解的services.yml生成器
使用场景
最小化基于单文件服务的services.yml依赖注入产生的冲突问题
安装
使用composer安装
在composer.json中添加"symfony-scripts"列表中的"Compass\ServiceHandler\ScriptHandler::buildServices"命令。它应该看起来像下面这样
"scripts": { ... "post-install-cmd": [ "Compass\\ServiceHandler\\ScriptHandler::buildServices", "@auto-scripts" ], "post-update-cmd": [ "Compass\\ServiceHandler\\ScriptHandler::buildServices", "@auto-scripts" ], "post-autoload-dump": [ "Compass\\ServiceHandler\\ScriptHandler::buildServices" ], }
定义哪个包将自动在app文件夹中生成services.yml
service.yml
parameters: locale: en service_handler: App\: resource: 'src/' exclude: 'src/{Controller,Entity,Exclude,Repository,Kernel.php}'
在composer.json文件的extra部分作为
compass-services
定义将处理哪个文件composer.json
"extra": { ... "compass-services": { "file": "config/services.yaml" } }
将
services.yml
添加到.gitignore
使用方法
每次执行composer install
或composer update
命令后,services.yml将会自动生成
在仓库类中使用@Service
注解
namespace App\Repository;
use Compass\ServiceHandler\Annotation\Service;
/**
* @Service(
* id="app.repository.my_repository",
* factory= {"@doctrine.orm.default_entity_manager", "getRepository"},
* arguments={"App:MyEntity"},
* calls={
* {"setSender", {"@App\Mailer\Sender"}}
* }
* )
*/
class MyRepository {
}
在事件监听类中使用@Service
注解
namespace App\EventListener;
use Compass\ServiceHandler\Annotation\Service;
use Compass\ServiceHandler\Annotation\Tag;
/**
* @Service(
* id="app.event_listener.my_listener",
* arguments={
* "@App\Repository\MyRepository",
* "@App\Mailer\Sender"
* },
* tags={
* @Tag(name="kernel.event_listener", event="success", method="onSuccess"),
* @Tag(name="kernel.event_listener", event="fail", method="onFail")
* }
* )
*/
class MyListener {
}
@Service
注解的使用与基于services.yml的定义没有区别。