https://github.com/trntv/yii2-command-bus
Command Bus for Yii2
https://github.com/trntv/yii2-command-bus
command-bus yii2
Last synced: 12 months ago
JSON representation
Command Bus for Yii2
- Host: GitHub
- URL: https://github.com/trntv/yii2-command-bus
- Owner: trntv
- License: bsd-3-clause
- Created: 2016-01-20T13:46:43.000Z (over 10 years ago)
- Default Branch: master
- Last Pushed: 2018-04-23T12:31:56.000Z (about 8 years ago)
- Last Synced: 2025-05-08T20:57:48.083Z (12 months ago)
- Topics: command-bus, yii2
- Language: PHP
- Size: 59.6 KB
- Stars: 57
- Watchers: 11
- Forks: 18
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Yii2 Command Bus
Command Bus for Yii2
[](https://travis-ci.org/trntv/yii2-command-bus)
## What is Command Bus?
> The idea of a command bus is that you create command objects that represent what you want your application to do.
> Then, you toss it into the bus and the bus makes sure that the command object gets to where it needs to go.
> So, the command goes in -> the bus hands it off to a handler -> and then the handler actually does the job. The command essentially represents a method call to your service layer.
[Shawn McCool ©](http://shawnmc.cool/command-bus)
## Installation
The preferred way to install this extension is through [composer](http://getcomposer.org/download/).
Either run
```
php composer.phar require --prefer-dist trntv/yii2-command-bus
```
or add
```
"trntv/yii2-command-bus": "^1.0"
```
to your composer.json file
## Setting Up
### 1. Command Bus Service
After the installation, first step is to set the command bus component.
```php
return [
// ...
'components' => [
'commandBus' => [
'class' => 'trntv\bus\CommandBus'
]
],
];
```
### 2. Background commands support (optional)
Install required package:
```
php composer.phar require symfony/process:^3.0
```
For the background commands worker, add a controller and command bus middleware in your config
```php
'controllerMap' => [
'background-bus' => [
'class' => 'trntv\bus\console\BackgroundBusController',
]
],
'components' => [
'commandBus' =>[
...
'middlewares' => [
[
'class' => '\trntv\bus\middlewares\BackgroundCommandMiddleware',
'backgroundHandlerPath' => '@console/yii',
'backgroundHandlerRoute' => 'background-bus/handle',
]
]
...
]
],
```
Create background command
```php
class ReportCommand extends Object implements BackgroundCommand, SelfHandlingCommand
{
use BackgroundCommandTrait;
public $someImportantData;
public function handle($command) {
// do what you need
}
}
```
And run it asynchronously!
```php
Yii::$app->commandBus->handle(new ReportCommand([
'async' => true,
'someImportantData' => [ // data // ]
]))
```
### 3. Queued commands support (optional)
#### 3.1 Install required package:
```
php composer.phar require yiisoft/yii2-queue
```
#### 3.2 Configure extensions
If you need commands to be run in queue, you need to setup middleware and yii2-queue extensions.
```php
'components' => [
'queue' => [
// queue config
],
'commandBus' =>[
...
'middlewares' => [
[
'class' => '\trntv\bus\middlewares\QueuedCommandMiddleware',
// 'delay' => 3, // You can set default delay for all commands here
]
]
...
]
]
```
More information about yii2-queue config can be found [here](https://github.com/yiisoft/yii2-queue/blob/master/docs/guide/usage.md)
#### 3.4 Run queue worker
``yii queue/listen``
More information [here](https://github.com/yiisoft/yii2-queue/blob/master/docs/guide/worker.md#worker-starting-control)
#### 3.5 Create and run command
```php
class HeavyComputationsCommand extends Object implements QueuedCommand, SelfHandlingCommand
{
use QueuedCommandTrait;
public function handle() {
// do work here
}
}
$command = new HeavyComputationsCommand();
Yii::$app->commandBus->handle($command)
```
### 4. Handlers
Handlers are objects that will handle command execution
There are two possible ways to execute command:
#### 4.1 External handler
```php
return [
// ...
'components' => [
'commandBus' => [
'class' => 'trntv\bus\CommandBus',
'locator' => [
'class' => 'trntv\bus\locators\ClassNameLocator',
'handlers' => [
'app\commands\SomeCommand' => 'app\handlers\SomeHandler'
]
]
]
],
];
// or
$handler = new SomeHandler;
Yii::$app->commandBus->locator->addHandler($handler, 'app\commands\SomeCommand');
// or
Yii::$app->commandBus->locator->addHandler('app\handlers\SomeHandler', 'app\commands\SomeCommand');
```
#### 4.1 Self-handling command
```php
class SomeCommand implements SelfHandlingCommand
{
public function handle($command) {
// do what you need
}
}
$command = Yii::$app->commandBus->handle($command);
```