1. Go to this page and download the library: Download awd-studio/service-buses library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
awd-studio / service-buses example snippets
class MyMessage {}
interface MessageInterface {}
abstract class ParentMessage {}
final class MyMessage extends ParentMessage implements MessageInterface {}
use AwdStudio\Bus\Handler\InMemoryHandlerLocator;
$handlers = new InMemoryHandlerLocator();
// To assign a handler we can call a method `add`.
// As a "messageId" we send the FCQN of a message that we assign on.
// A handler must be any callable PHP-item.
$handlers->add(\stdClass::class, static function (\stdClass $message): void {});
// Now, we've got a handler that handles a message of type "stdClass".
// But, we can add more than one handler per message.
// Actually, it's not limited, but keep in mind the patterns
// such Command-bus or Query-bus that suppose to use the only one handler
// per a message that they handle.
// So, we can add more handlers to same message, for example a callable object:
$handler = new class {
public function __invoke(\stdClass $message): void {}
};
$handlers->add(\stdClass::class, $handler);
// So now, we have 2 handlers that are going to be released
// when somebody tries get them:
$handlers->get(\stdClass::class);
// To check if there are some handlers for certain message
// there is a method `has`:
$handlers->has(\stdClass::class); // true|false
use AwdStudio\Bus\Handler\InMemoryHandlerLocator;
// We need to use a handler locator, from which a bus will get handlers
$bus = new class(new InMemoryHandlerLocator()) extends \AwdStudio\Bus\SimpleBus {
// We need to provide a method that will handle our message
public function handle(object $message): void
{
// Our parent allows us to iterate all handlers
// that assigned to certain message
foreach ($this->handleAll($message) as $result) {
echo $result;
}
}
};
// To use a bus, we call a provided method:
$bus->handle(new \stdClass());
use AwdStudio\Bus\Handler\InMemoryHandlerLocator;
use AwdStudio\Command\SimpleCommandBus;
class MyCommand {
// Messages might be any of PHP class.
// No any of implementation or extending dBus($handlers);
$bus->handle(new MyCommand());
use AwdStudio\Bus\Handler\InMemoryHandlerLocator;
use AwdStudio\Query\SimpleQueryBus;
class MyQuery {
// Messages might be any of PHP class.
// No any of implementation or extending us = new SimpleQueryBus($handlers);
$result = $bus->handle(new MyQuery());
// Result will be:
// -> prefix foo suffix
use AwdStudio\Bus\Handler\InMemoryHandlerLocator;
use AwdStudio\Event\SimpleEventBus;
class MyEvent {
// Messages might be any of PHP class.
// No any of implementation or extending s pattern allows to provide any amount of subscribers
// we cah add more of them:
$subscribers->add(MyEvent::class, static function (MyEvent $event): void {});
$bus = new SimpleEventBus($subscribers);
$bus->handle(new MyEvent());
// After that, the event is delivered to each subscriber.
use AwdStudio\Bus\Handler\ParentsAwareClassHandlerRegistry;
use AwdStudio\Bus\Handler\PsrContainerClassHandlerRegistry;
use Psr\Container\ContainerInterface;
class MyPsr11Container implements ContainerInterface {}
interface Foo {}
abstract class Bar {}
final class Baz extends Bar implements Foo {}
class Handler
{
// You can subscribe on any of level
public function __invoke(Foo $message): void {}
// ..or
public function __invoke(Bar $message): void {}
// ..or
public function __invoke(Baz $message): void {}
}
$handlerRegistry = new ParentsAwareClassHandlerRegistry(new PsrContainerClassHandlerRegistry(new MyPsr11Container()));
use AwdStudio\Bus\Handler\PsrContainerClassHandlerRegistry;
use AwdStudio\Bus\SimpleBus;
use Psr\Container\ContainerInterface;
class MyPsr11Container implements ContainerInterface
{
private $dependencies;
public function __construct(array $dependencies)
{
$this->dependencies = $dependencies;
}
public function has($id): bool
{
return \in_array($id, $this->dependencies, true);
}
public function get($id): object
{
return $id();
}
}
class StdClassHandler
{
public function __invoke(\stdClass $message): void
{
$message->foo = 'foo';
}
}
$serviceLocator = new MyPsr11Container([StdClassHandler::class]);
$handlerRegistry = new PsrContainerClassHandlerRegistry($serviceLocator);
// To assign a handler use a defined method:
$handlerRegistry->register(\stdClass::class, StdClassHandler::class);
// And pass them as a handler-locator to a bus
$bus = new class ($handlerRegistry) extends SimpleBus {
public function handle(object $message): void
{
foreach ($this->handleAll($message) as $result) {
echo $result;
}
}
};
// After that, you can call handling as usual:
$bus->handle(new \stdClass()); // The handler will be executed
use AwdStudio\Bus\Handler\AutoRegisterHandlersRegistryClass;
use AwdStudio\Bus\Handler\PsrContainerClassHandlerRegistry;
$psrRegistry = new PsrContainerClassHandlerRegistry(new MyPsr11Container());
$autoRegistry = new AutoRegisterHandlersRegistryClass($psrRegistry);
// Now, you can add a callback to assign a handler automatically.
// Just be sure, that it has a correct type-hint of a message that it handles.
$handler = static function (\stdClass $message): void { };
$autoRegistry->autoAdd($handler); // It will be called within the stdClass' messages.
// And this is not all it can!
// If you use services as handlers - you also can register them automatically.
// Suppose we have this handler, that can be resolved from our container:
class Handler {
public function __invoke(\stdClass $message): void { }
}
// We can register it like so:
$autoRegistry->autoRegister(Handler::class);
// That's all..
use AwdStudio\Bus\Handler\PsrContainerClassHandlerRegistry;
class Handler {
public function handle(\stdClass $message): void { }
}
// Any registry can manage with it out of the box
$psrRegistry = new PsrContainerClassHandlerRegistry(new MyPsr11Container());
$psrRegistry->register(\stdClass::class, Handler::class, 'handle');
// The 3rd argument tells which method is in charge of handling.
use AwdStudio\Bus\SimpleBus;
class MyBus extends SimpleBus
{
public function handle(object $message): string
{
$result = '';
foreach ($this->handleAll($message) as $handled) {
$result .= $handled;
}
return $result;
}
}
use AwdStudio\Bus\SimpleBus;
class MyBus extends SimpleBus
{
public function handle(object $message): string
{
$result = '';
foreach ($this->handleMessage($message) as $chain) {
$result .= $chain();
}
return $result;
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.