A flexible command bus for ReactPHP
Go to file
Christopher Vagnetoft 07f8ae467c Make CommandBus use CommandResolverInterface
* Add CommandResolverInterface to resolve commands.
* Replace single CommandRegistry with CommandResolverInterface[]
  in CommandBus.
* Make CommandRegistry implement CommandResolverInterface.
2024-12-15 13:24:57 +01:00
examples First set of tests, argument unwrapping/injection 2024-03-19 00:01:12 +01:00
src Make CommandBus use CommandResolverInterface 2024-12-15 13:24:57 +01:00
tests First set of tests, argument unwrapping/injection 2024-03-19 00:01:12 +01:00
.gitignore Initial commit 2024-03-01 14:34:14 +01:00
composer.json Initial commit 2024-03-01 14:34:14 +01:00
LICENSE First set of tests, argument unwrapping/injection 2024-03-19 00:01:12 +01:00
Makefile First set of tests, argument unwrapping/injection 2024-03-19 00:01:12 +01:00
phpstan.neon Initial commit 2024-03-01 14:34:14 +01:00
phpunit.xml First set of tests, argument unwrapping/injection 2024-03-19 00:01:12 +01:00
README.md First set of tests, argument unwrapping/injection 2024-03-19 00:01:12 +01:00

Command Bus for ReactPHP

Features

  • Can run monolithic (create a bus and use as is), or distributed (create bus and use clients), or in a hybrid setup. The CommandBus functions identical with or without listeners and clients.
  • All commands called asynchronously using promises and deferreds.
  • Push notifications from the bus to subscribers and listeners, such as progress or log/error messages.

Potential caveats

  • There is no security, nor encryption. This is intended to work between a daemon and a frontend, and is designed primarily considering all activity taking place on localhost. You can use ReactPHPs SecureConnector and SecureServer to encrypt the traffic, but this still allows anyone to connect and interact with the bus. If this sounds like something that should be changed, open a ticket.

Installing

$ composer require noccylabs/react-command-bus:^0.1.0

Usage

// The registry holds the callable commands
$commands = new CommandRegistry();

// Register some function to call. The name here is "hello", and it will
// receive a Context holding the call context. Any passed data will be
// available as properties on the Context object.
$commands->register("hello", function (Context $context) {
    // You don't have to, but you should return a promise from your 
    // commands.
    return new Promise(function (callable $resolve) use ($context) {
        Loop::addTimer(1, function () use ($context, $resolve) {
            $resolve("Hello, {$context->name}");
        });
    });
});

// Create the bus
$bus = new CommandBus($commands);

// And execute some commands!
$bus->execute('hello', ['name'=>'Bob'])->then(
    function ($result) {
        var_dump($result);
    }
);

License

Copyright (C) 2024, NoccyLabs

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/.