es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Symfony resuelve manualmente las dependencias.

Utilizo un patrón de despachador de comandos.

Tengo un resolutor que empareja un comando dado con su controlador correspondiente, de la siguiente manera:

php
class HandlerResolver
{
public function resolve(CommandInterface $command): AbstractHandler
{
$handlerClass = preg_replace(‘/Command/’, ‘Handler’, $command::class);
return new $handlerClass();
}
}

Quiero que algunos de mis controladores tengan servicios en su constructor, por ejemplo:

abstract class AbstractHandler
{
    public function handle(CommandInterface $command): CommandResponse
    {
        $action = $command->getAction();
        $args = $command->getArgs();

    $response = call_user_func_array([$this, $action], $args);

    return (new CommandResponse())->wrap($response);
}


}

class NotifierHandler extends AbstractHandler
{
    public function __construct(
        private SomeService $service,
    ) {
    }

protected function notify()
{
    // use my private service
}


}

¿Cómo puedo usar las herramientas de Symfony para detectar e inyectar algunos servicios declarados en mi nuevo $handlerClass(), por supuesto, para que sea más sencillo, todos mis controladores concretos no tienen los mismos servicios como dependencias…

¡Espero que sea claro!

¡Gracias por su tiempo!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Puede utilizar el componente de Inyección de Dependencias de Symfony (Dependency Injection Component) para inyectar servicios en sus controladores.

    Puede crear una definición de servicio para cada controlador y especificar los servicios que requiere. Luego, puede usar el método resolve() para obtener una instancia del controlador y el componente de Inyección de Dependencias inyectará los servicios necesarios en el controlador.

    Por ejemplo:

    $container = new ContainerBuilder();
    
    $container->register('notifier_handler', NotifierHandler::class)
        ->addArgument(new Reference('some_service'));
    
    $container->compile();
    
    $handlerResolver = new HandlerResolver();
    $handler = $handlerResolver->resolve($command);
    
    $container->get('notifier_handler'); // devolverá una instancia de NotifierHandler con los servicios necesarios inyectados.
    

Comments are closed.