2012-07-10 13 views
7

Actualmente tengo preparada una instancia de contenedor DI Symfony2 con un servicio y todas sus dependencias. Digamos, por ejemplo, tengo una clase de automóvil y tiene motor y luces como dependencias.Dependencias de carga diferidas con symfony DI

En mi configuración actual, estas dos dependencias se crean automáticamente a través de la inyección de setter cuando se crea el objeto Car, pero puede ser que mi objeto Car no necesite luces esta vez, por lo que no necesita explícitamente para crear una instancia de esta dependencia.

¿Hay alguna manera de lograr esto en Symfony DI? Por lo tanto, ¿solo crear una instancia del objeto Lights cuando sea necesario? Supongo que será algún tipo de implementación Proxy como Doctrine pero, hasta donde he visto, no existe en Symfony DI.

Respuesta

2

inyectar el dedendencies que son obligatorias a través del constructor a través de su services.yml, de forma automática.
Si tiene dependencias opcionales, introdúzcalos a través de un setter en su Controlador cuando los necesite.

$this->container->get('cars')->setLights(new \Namespace\Lights()); 

Por supuesto, su clase cabinas deberán diseñarse como tal y hay que dirigir las inyecciones usted mismo en su controlador, o dondequiera que sea necesario, el código.

1

Una pregunta muy interesante, pero no creo que sea posible dentro del Contenedor de Inyección de Dependencia de Symfony2. El contenedor solo es consciente de lo que le dice; en este caso, tiene una dependencia condicionada a un caso de uso específico. Además, el registro de los servicios ocurre al principio de la vida de la aplicación, por lo que no veo cómo se puede lograr que esto funcione.

Quizás debería usar el patrón de fábrica. Registre un CarFactory como un servicio, y luego al buscar una instancia Car, puede especificar que debe incluir una dependencia Light.

¿Puedo preguntar por qué quieres lograr esto? Puede haber una solución más simple.

+0

Bueno, en mi caso, estoy implementando el componente DI autónomo en un proyecto ZF más antiguo. Tengo varias clases de servicio (AdminService, UserService, ...) que tienen dependencias como DBAL, ACL, etc. Estos son requisitos reales para que la clase de servicio funcione correctamente. Por otro lado, hay casos como un Formulario y un Modelo que solo se utilizan en algunos de los métodos de ServiceClass. Estas son las dependencias "condicionales". Estoy pensando que también es bastante imposible a menos que Symfony DI tenga un sistema de proxy como la doctrina usa para sus Entidades. – ChrisR

0

No es una solución bonita, pero puede intentar inyectar todo el DIC, y luego obtener los servicios de Luz y Motor cuando sea necesario.

Estaba pensando en algo parecido a este método en la clase Car:

protected function getLightService() 
{ 
    if (!$this->light) { //so we reuse the first instance 
     $this->light = $this->dic->get("car.light"); 
    } 

    return $this->light; 
} 
+0

Actualmente no estoy inyectando el contenedor DI sino haciendo referencia al ZF FrontController como este: 'Zend_Controller_Front :: getInstance() -> getParam ('bootstrap') -> getDic()'. ¿Alguna razón para no hacerlo así? – ChrisR

+0

No tengo experiencia con ZF, así que no puedo responder eso. Si funciona bien para ti, supongo que está bien. – Maerlyn

2

La pregunta ya está respondida, pero para quién necesita esta funcionalidad, los servicios perezosos se implementan en Symfony 2.3.

Necesita instalar el ProxyManager bridge.

Puede encontrar la documentación oficial here.

Cuestiones relacionadas