54 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace NoccyLabs\React\CommandBus;
 | 
						|
use Evenement\EventEmitterInterface;
 | 
						|
use Evenement\EventEmitterTrait;
 | 
						|
 | 
						|
/**
 | 
						|
 * A collection of commands that can be executed via CommandBusInterface
 | 
						|
 *
 | 
						|
 */
 | 
						|
class CommandRegistry implements EventEmitterInterface
 | 
						|
{
 | 
						|
    use EventEmitterTrait;
 | 
						|
 | 
						|
    const EVENT_REGISTERED = 'registered';
 | 
						|
    const EVENT_UNREGISTERED = 'unregistered';
 | 
						|
 | 
						|
    /** @var array<string,Command> */
 | 
						|
    private array $commands = [];
 | 
						|
 | 
						|
    public function register(string $command, callable $handler): void
 | 
						|
    {
 | 
						|
        $isNew = !array_key_exists($command, $this->commands);
 | 
						|
 | 
						|
        $this->commands[$command] = new Command($command, $handler);
 | 
						|
 | 
						|
        if ($isNew) {
 | 
						|
            $this->emit(self::EVENT_REGISTERED, [ $command ]);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function unregister(string $command): void
 | 
						|
    {
 | 
						|
        if (!array_key_exists($command, $this->commands)) {
 | 
						|
            return;
 | 
						|
        }
 | 
						|
 | 
						|
        unset($this->commands[$command]);
 | 
						|
 | 
						|
        $this->emit(self::EVENT_UNREGISTERED, [ $command ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function find(string $command): ?Command
 | 
						|
    {
 | 
						|
        return $this->commands[$command] ?? null;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getNames(): array
 | 
						|
    {
 | 
						|
        return array_keys($this->commands);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |