amine-lejmi / messenger-maker
分离并增强 symfony messenger 查询、事件和命令消息的创建。
v1.0.1
2024-07-19 09:27 UTC
Requires
- php: >=7.2.5
- symfony/console: >=5.4
- symfony/maker-bundle: >=1.40
- symfony/messenger: >=5.0
- symfony/yaml: >=5.4
README
MessengerMaker 是一个简化消息创建和注册的 Symfony 扩展包,明确区分查询、命令和事件。
主要功能
- 自动消息创建:轻松创建和分离查询、事件和命令。
- 输入和获取器生成:自动为消息生成输入和获取方法。
- 总线注册:无缝在指定的消息传输中注册消息。
此扩展包在 Symfony/Messenger 的基础上增加了一层,利用其配置。更多详细信息,请参阅 Symfony Messenger 组件文档。
安装
请确保已全局安装 Composer,如 Composer 文档中的 安装章节 所述。
使用 Symfony Flex 的应用程序
打开命令行控制台,进入您的项目目录并执行
composer require amine-lejmi/messenger-maker
不使用 Symfony Flex 的应用程序
步骤 1:下载扩展包
打开命令行控制台,进入您的项目目录并执行以下命令以下载此扩展包的最新稳定版本
composer require amine-lejmi/messenger-maker
步骤 2:启用扩展包
然后,通过将其添加到项目 config/bundles.php
文件中注册的扩展包列表中来启用扩展包
// config/bundles.php return [ // ... AmineLejmi\MessengerMaker\MessengerMakerBundle::class => ['all' => true], ];
安装后
要使用提供的接口以自动将消息注册到相应的总线中,请将以下行添加到您的 config/services.yaml
配置文件中
services: # ... _instanceof: AmineLejmi\MessengerMaker\Contract\CommandHandlerInterface: tags: - { name: messenger.message_handler, bus: command.bus } AmineLejmi\MessengerMaker\Contract\EventHandlerInterface: tags: - { name: messenger.message_handler, bus: event.bus } AmineLejmi\MessengerMaker\Contract\QueryHandlerInterface: tags: - { name: messenger.message_handler, bus: query.bus }
注意:您只能添加项目中需要的接口。
使用方法
此扩展包提供用于创建命令、查询和事件的三个不同的控制台命令
1- 创建新的命令
php bin/console make:messenger:command <command-name>
注意: <command-name>
必须以 "Command" 结尾。
2- 创建新的查询
php bin/console make:messenger:query <query-name>
注意: <query-name>
必须以 "Query" 结尾。
3- 创建新的事件
php bin/console make:messenger:event <event-name>
注意: <event-name>
必须以 "Event" 结尾。
工作原理
执行命令
对于这些命令中的每一个,控制台都会提示您
- 选择在
config/messenger.yaml
中配置的相应传输
$ php bin/console make:messenger:command SendEmailCommand Register this command as : [none]: [0] none [1] low-priority [2] high-priority >
注意:选择传输后,扩展包将自动在 config/packages/messenger.yaml
中的路由部分注册消息
framework: # ... messenger: # ... routing: # ... App\Messenger\Command\SendEmailCommand: low-priority # ...
- 添加特定消息所需的任何其他输入
New property name (press <return> to stop adding fields): > Field type (enter ? to see all types) [string]: > Can this field be null (nullable) (yes/no) [no]: >
按照提示完成命令、查询或事件的创建。
文件创建
根据您执行的命令,将创建包含相应文件的相应文件夹
📦project_dir
┣ 📂...
┣ 📂 src
┃ ┗ 📂 Messenger
┃ ┗ 📂 Command
┃ ┗ 📂 CommandHandler
┃ ┗ 📂 Event
┃ ┗ 📂 EventHandler
┃ ┗ 📂 Query
┃ ┗ 📂 QueryHandler
注意:处理器实现接口,以便可以将它们分发到相应的总线
- query.bus
- event.bus
- command.bus
示例
<?php namespace App\Messenger\Command; class SendEmailCommand { private string $address; private ?string $message; public function __construct(string $address, ?string $message) { $this->address = $address; $this->message = $message; } public function getAddress(): string { return $this->address; } public function getMessage(): ?string { return $this->message; } }
<?php namespace App\Messenger\CommandHandler; use AmineLejmi\MessengerMaker\Contract\CommandHandlerInterface; use App\Messenger\Command\SendEmailCommand; class SendEmailCommandHandler implements CommandHandlerInterface { public function __construct() { } public function __invoke(SendEmailCommand $command) { $address = $command->getAddress(); $message = $command->getMessage(); // Do something with your variables } }