Make CommandBus use CommandResolverInterface
* Add CommandResolverInterface to resolve commands. * Replace single CommandRegistry with CommandResolverInterface[] in CommandBus. * Make CommandRegistry implement CommandResolverInterface.
This commit is contained in:
		@@ -13,30 +13,92 @@ class CommandBus implements CommandBusInterface
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    use EventEmitterTrait;
 | 
					    use EventEmitterTrait;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private CommandRegistry $commandRegistry;
 | 
					    /** @var array<CommandResolverInterface> */
 | 
				
			||||||
 | 
					    private $resolvers = [];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private SplObjectStorage $connections;
 | 
					    private SplObjectStorage $connections;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private SplObjectStorage $servers;
 | 
					    private SplObjectStorage $servers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function __construct(CommandRegistry $commandRegistry)
 | 
					    public function __construct(?CommandResolverInterface $commands=null)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->commandRegistry = $commandRegistry;
 | 
					        if ($commands) {
 | 
				
			||||||
 | 
					            $this->resolvers[] = $commands;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        $this->connections = new SplObjectStorage();
 | 
					        $this->connections = new SplObjectStorage();
 | 
				
			||||||
        $this->servers = new SplObjectStorage();
 | 
					        $this->servers = new SplObjectStorage();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public function getRegistry(): CommandRegistry
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get the command registry
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @deprecated Use getCommandNames() instead
 | 
				
			||||||
 | 
					     * @return null
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getRegistry(): ?CommandRegistry
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return $this->commandRegistry;
 | 
					        return null; // $this->commandRegistry;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Add a CommandResolver
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param CommandResolverInterface $resolver
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function addResolver(CommandResolverInterface $resolver): void
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $this->resolvers[] = $resolver;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Get the names of defined commands
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return array
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function getCommandNames(): array
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        $commands = [];
 | 
				
			||||||
 | 
					        foreach ($this->resolvers as $resolver) {
 | 
				
			||||||
 | 
					            $commands = array_merge($commands, $resolver->getNames());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        sort($commands);
 | 
				
			||||||
 | 
					        return array_unique($commands);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Find a command by searching through the resolvers
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param string $command
 | 
				
			||||||
 | 
					     * @return Command|null
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public function findCommand(string $command): ?Command
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        foreach ($this->resolvers as $resolver) {
 | 
				
			||||||
 | 
					            if ($found = $resolver->find($command))
 | 
				
			||||||
 | 
					                return $found;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Add a server listener
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param ServerInterface $server
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public function addServer(ServerInterface $server): void
 | 
					    public function addServer(ServerInterface $server): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->servers->attach($server);
 | 
					        $this->servers->attach($server);
 | 
				
			||||||
        $server->on('connection', $this->onServerConnection(...));
 | 
					        $server->on('connection', $this->onServerConnection(...));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Remove a server listener
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param ServerInterface $server
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public function removeServer(ServerInterface $server): void
 | 
					    public function removeServer(ServerInterface $server): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $server->close();
 | 
					        $server->close();
 | 
				
			||||||
@@ -44,6 +106,11 @@ class CommandBus implements CommandBusInterface
 | 
				
			|||||||
        $this->servers->detach($server);
 | 
					        $this->servers->detach($server);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Close and shutdown the servers
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @return void
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
    public function close(): void
 | 
					    public function close(): void
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        foreach ($this->servers as $server) {
 | 
					        foreach ($this->servers as $server) {
 | 
				
			||||||
@@ -106,7 +173,7 @@ class CommandBus implements CommandBusInterface
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    private function executeContext(Context $context): PromiseInterface
 | 
					    private function executeContext(Context $context): PromiseInterface
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        $command = $this->commandRegistry->find($context->getCommandName());
 | 
					        $command = $this->findCommand($context->getCommandName());
 | 
				
			||||||
        if (!$command) return new Promise(function (callable $resolve) use ($context) {
 | 
					        if (!$command) return new Promise(function (callable $resolve) use ($context) {
 | 
				
			||||||
            throw new \RuntimeException("Unable to resolve command: ".$context->getCommandName());
 | 
					            throw new \RuntimeException("Unable to resolve command: ".$context->getCommandName());
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,8 +38,8 @@ class CommandBusClient implements CommandBusInterface
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        $this->commandRegistry = $commandRegistry;
 | 
					        $this->commandRegistry = $commandRegistry;
 | 
				
			||||||
        if ($commandRegistry) {
 | 
					        if ($commandRegistry) {
 | 
				
			||||||
            $commandRegistry->on(CommandRegistry::EVENT_REGISTERED, $this->onCommandRegistered(...));
 | 
					            $this->commandRegistry->on(CommandRegistry::EVENT_REGISTERED, $this->onCommandRegistered(...));
 | 
				
			||||||
            $commandRegistry->on(CommandRegistry::EVENT_UNREGISTERED, $this->onCommandUnregistered(...));
 | 
					            $this->commandRegistry->on(CommandRegistry::EVENT_UNREGISTERED, $this->onCommandUnregistered(...));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        $this->connector = $connector??new TcpConnector();
 | 
					        $this->connector = $connector??new TcpConnector();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,7 +8,7 @@ use Evenement\EventEmitterTrait;
 | 
				
			|||||||
 * A collection of commands that can be executed via CommandBusInterface
 | 
					 * A collection of commands that can be executed via CommandBusInterface
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
class CommandRegistry implements EventEmitterInterface
 | 
					class CommandRegistry implements CommandResolverInterface, EventEmitterInterface
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    use EventEmitterTrait;
 | 
					    use EventEmitterTrait;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										19
									
								
								src/CommandResolverInterface.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								src/CommandResolverInterface.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					<?php
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace NoccyLabs\React\CommandBus;
 | 
				
			||||||
 | 
					use Evenement\EventEmitterInterface;
 | 
				
			||||||
 | 
					use Evenement\EventEmitterTrait;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * A collection of commands that can be executed via CommandBusInterface
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					interface CommandResolverInterface
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    public function find(string $command): ?Command;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public function getNames(): array;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		Reference in New Issue
	
	Block a user