Skip to content

Instantly share code, notes, and snippets.

@guilhermeblanco
Last active August 29, 2015 14:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save guilhermeblanco/78d190d5685cb8ddcc4a to your computer and use it in GitHub Desktop.
Save guilhermeblanco/78d190d5685cb8ddcc4a to your computer and use it in GitHub Desktop.
<?php
use SimpleBus\Message\Bus\Middleware\MessageBusSupportingMiddleware;
use SimpleBus\Message\Handler\DelegatesToMessageHandlerMiddleware;
use SimpleBus\Message\Handler\Resolver\NameBasedMessageHandlerResolver;
use SimpleBus\Message\Name\NamedMessageNameResolver;
// Consider this is available
$pimple = new \Pimple();
// Currently I need to do this:
$commandBus = new MessageBusSupportingMiddleware();
$commandBus->appendMiddleware(
new DelegatesToMessageHandlerMiddleware(
new NameBasedMessageHandlerResolver(
new NamedMessageNameResolver(),
new CallableMap(
[
'command_name' => 'whatever' // Keeping this list is wrong... =(
],
new ServiceLocatorAwareCallableResolver(function ($id) use ($pimple) {
return $pimple[$id];
})
)
)
)
);
/*
Issue here comes that now I need to keep a list of all command names and its resolved values somehow.
Problem relies that NameBasedMessageHandlerResolver signature enforces a MessageNameResolver (ok),
and a CallableMap (which is wrong. it should rely on CallableResolver).
By applying this change, the now reversed dependency (CallableMap => CallableResolver) would require minor changes,
but CallableResolver implementor could accept a CallableMap (or CallableCollection) and do an index based get.
*/
// My better alternative here (to not keep the list) is to implement my own MessageHandlerResolver,
// but CallableResolver and Name namespaces are not useful (~50% of library's code).
// I can stretch the usage and force Name namespace to be used, but not a real reason for that...
// Example:
use SimpleBus\Message\Handler\Resolver\MessageHandlerResolver;
use SimpleBus\Message\Name\MessageNameResolver;
final class PimpleMessageHandlerResolver implements MessageHandlerResolver
{
private $messageNameResolver;
private $pimple;
public function __construct(MessageNameResolver $messageNameResolver, \Pimple $pimple)
{
$this->messageNameResolver = $messageNameResolver;
$this->pimple = $pimple;
}
public function resolve($message)
{
$name = $this->messageNameResolver->resolve($message);
return $this->pimple[$name];
}
}
$commandBus = new MessageBusSupportingMiddleware();
$commandBus->appendMiddleware(
new DelegatesToMessageHandlerMiddleware(
new PimpleMessageHandlerResolver(
new NamedMessageNameResolver(),
$pimple
)
)
);
<?php
use SimpleBus\Message\CallableResolver\CallableResolver
final class PimpleCallableResolver implemented CallableResolver
{
private $pimple;
public function __construct(\Pimple $pimple)
{
$this->pimple = $pimple;
}
public function resolve($name)
{
return $pimple[$name];
}
}
<?php
use SimpleBus\Message\Bus\Middleware\MessageBusSupportingMiddleware;
use SimpleBus\Message\Handler\DelegatesToMessageHandlerMiddleware;
use SimpleBus\Message\Handler\Resolver\NameBasedMessageHandlerResolver;
use SimpleBus\Message\Name\NamedMessageNameResolver;
// Consider this is available
$pimple = new \Pimple();
// I should be able to do this:
$commandBus = new MessageBusSupportingMiddleware();
$commandBus->appendMiddleware(
new DelegatesToMessageHandlerMiddleware(
new NameBasedMessageHandlerResolver(
new NamedMessageNameResolver(),
new PimpleCallableResolver($pimple)
)
)
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment