2012-07-25 22 views
9

En la definición de mis servicios, me gustaría pasar como un constructor de argumento de servicio un objeto, no un servicio.Symfony: objeto de inyección (no servicio) al constructor de servicio

De config.yml:

services: 
    acme.services.exampleservice: 
    class: Acme\ExampleBundle\Services\ExampleService 
    arguments: 
     entityManager: "@doctrine.orm.entity_manager" 
     httpClient: \Example\Http\Client\Client 

nota del argumento httpClient. Debe ser una instancia de la clase \Example\Http\Client\Client.

Lo anterior no funciona: la cadena "\ Example \ Http \ Client \ Client" se pasa como el argumento httpClient al servicio.

¿Cuál es la sintaxis para lograr lo anterior al pasar una instancia de \Example\Http\Client\Client al constructor del servicio?

Respuesta

18

Crear un servicio privado. Aquí es lo que está escrito en the documentation:

Si utiliza un servicio privado como un argumento a más de un otro servicio, esto se traducirá en dos casos diferentes que se utilizan como la creación de instancias del servicio privado que se hace en línea (por ejemplo, nueva PrivateFooBar()).

services: 
    acme.services.exampleservice: 
    class: Acme\ExampleBundle\Services\ExampleService 
    arguments: 
     entityManager: "@doctrine.orm.entity_manager" 
     httpClient: acme.services.httpClient 

    acme.services.httpClient: 
    class: Example\Http\Client\Client 
    public: false 

Usted no será capaz de recuperar un servicio privado desde el contenedor. Desde el exterior, parece que pasaste un objeto común al constructor de tu servicio.

+1

¡Señor, me salvaste el culo! ¡Gracias! –

Cuestiones relacionadas