53 lines
1.4 KiB
Markdown
53 lines
1.4 KiB
Markdown
|
# Command Bus for ReactPHP
|
||
|
|
||
|
* Can run monolithic (create a bus and use as is), or distributed (create bus and use clients), or a hybrid.
|
||
|
* All commands called asynchronously using promises and deferreds.
|
||
|
|
||
|
## Installing
|
||
|
|
||
|
```shell
|
||
|
$ composer require noccylabs/react-command-bus:^0.1.0
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
```php
|
||
|
// This is enough to setup a local bus.
|
||
|
$bus = new CommandBus();
|
||
|
$bus->register('hello', function (Context $context) {
|
||
|
return new Promise(function (callable $resolve) use ($context) {
|
||
|
return $resolve([ 'message' => "Hello, {$context->name}" ]);
|
||
|
});
|
||
|
});
|
||
|
|
||
|
// You can call it as expected
|
||
|
$bus->execute('hello', [ 'name' => "Bob" ])
|
||
|
->then(function (array $result) {
|
||
|
echo "Result: {$result['message']}\n";
|
||
|
});
|
||
|
|
||
|
// Add a listener, and you can now connect to it!
|
||
|
$bus->addServer($server);
|
||
|
|
||
|
|
||
|
// So using this in another script works as expected, if you consider
|
||
|
// the async flow. See the examples for working examples.
|
||
|
|
||
|
$client = new CommandBusClient();
|
||
|
$client->connect($socket);
|
||
|
|
||
|
$client->execute('hello', [ 'name' => "Bob" ])
|
||
|
->then(function (array $result) {
|
||
|
echo "Result: {$result['message']}\n";
|
||
|
});
|
||
|
|
||
|
|
||
|
// The bus can also notify all clients about important events
|
||
|
$bus->notify('updateCompleted', [ 'info' => [] ]);
|
||
|
|
||
|
// Listening on the bus or client will yield the event
|
||
|
$bus->on('notify', function (string $event, array $data) {});
|
||
|
$client->on('notify', function (string $event, array $data) {});
|
||
|
|
||
|
```
|