upgate / laravel-command-bus
Laravel 命令总线
0.2.1
2020-08-15 14:01 UTC
Requires
- php: >=7.2
- illuminate/contracts: ^5.1 || ^6 || ^7
- illuminate/support: ^5.1 || ^6 || ^7
Requires (Dev)
- phpunit/phpunit: ~8.2
This package is auto-updated.
Last update: 2024-09-15 22:44:20 UTC
README
设置
composer require upgate/laravel-command-bus
- 将
Upgate\LaravelCommandBus\CommandBusServiceProvider
注册为服务提供者 - 在你的服务提供者中,将
Upgate\LaravelCommandBus\HandlerResolver
绑定到您选择的实现。
HandlerResolver 绑定示例
a) PatternHandlerResolver
$this->app->singleton( \Upgate\LaravelCommandBus\HandlerResolver::class, function () { return new \Upgate\LaravelCommandBus\PatternHandlerResolver( '\YourAppNamespace\CommandHandlers\%sHandler' ); } );
b) MapHandlerResolver
use YourAppNamespace\Commands; use YourAppNamespace\CommandHandlers; // ... $this->app->singleton( \Upgate\LaravelCommandBus\HandlerResolver::class, function () { return new \Upgate\LaravelCommandBus\MapHandlerResolver( [ Commands\FooCommand::class => Handlers\FooHandler::class, Commands\BarCommand::class => Handlers\BarHandler::class, // ... ] ); } );
c) 绑定您自己的实现(必须扩展 \Upgate\LaravelCommandBus\HandlerResolver
)。
用法
简化示例
// Command class SignUpCommand { public function __construct($email, $password) { $this->email = $email; $this->password = $password; } public function email() { return $this->email; } public function password() { return $this->password; } } // Handler class SignUpHandler { public function __construct(UserRepository $userRepository) { $this->userRepository = $userRepository; } public function handle(SignUpCommand $command) { $user = User::signUp($command->email(), $command->password()); $this->userRepository->store($user); } } // HTTP Controller use Upgate\LaravelCommandBus\CommandBus; class UserController { private $commandBus; public function __construct(CommandBus $commandBus) { $this->commandBus = $commandBus; } public function signUp(Request $request) { $this->commandBus->execute(new SignUpCommand( $request->get('email'), $request->get('password') )); } } // Console command use Upgate\LaravelCommandBus\CommandBus; class SignUpUserConsoleCommand { private $commandBus; public function __construct(CommandBus $commandBus) { $this->commandBus = $commandBus; } public function handle() { $this->commandBus->execute(new SignUpCommand( $this->argument('email'), $this->argument('password') )); } }
当然,您可能(并且应该)希望引入 Controller 和 ConsoleCommand 抽象类,并实现 executeCommand()
方法。