2011-12-24 12 views

Respuesta

24

Defina su clase personalizada como un servicio y luego inserte dependencias en ella.

Ex:

// services.yml 
services: 
    my.custom.service.id: 
     class: My\Custom\Class 
     arguments: 
     - @service.name 
     - @doctrine.orm.entity_manager 

la clase personalizada constructor sería entonces obtener esos servicios como argumentos.

Asegúrese de leer en el Contenedor de servicios en los documentos oficiales. Repasa todo esto en gran detalle.

-3

OK supongo @Arms respuesta es una solución posible, encontrar buscando en la fuente a Controller, que podría extenderse ContainerAware

+2

Tenga en cuenta que si se amplía 'ContainerAware' es necesario configurar manualmente el objeto contenedor. Si está instanciando su clase personalizada en algún lugar que no tiene acceso al contenedor, esto no será posible. –

+3

Inyectar todo el contenedor es una mala idea. Inyecte explícitamente cada servicio que necesita en su servicio. –

7

Usted estaba en el camino correcto con ContainerAware.

$this->get('id') es en realidad un acceso directo a $this->container->get('id'). Y conseguir recipiente en su clase es tan simple como la implementación de ContainerAwareInterface - poner este fragmento en su clase:

public function setContainer(\Symfony\Component\DependencyInjection\ContainerInterface $container = null) 
{ 
    $this->container = $container; 
} 
+5

Para quien puso -1: realmente me gustaría una explicación de por qué crees que mi respuesta fue incorrecta y cuál es la respuesta correcta. Tenga en cuenta que la pregunta era básicamente: "¿cómo inyectar el contenedor de servicio en una clase personalizada?" – Inoryy

+3

No soy el que votó negativamente, pero la pregunta original fue cómo acceder a un servicio en una clase personalizada, no cómo inyectar el contenedor de servicio (lo que se considera una mala práctica) –

+5

Preguntó cómo acceder a los servicios en una aplicación personalizada clase, no cómo inyectar un determinado servicio en él, incluso dio un ejemplo de controlador y estaba buscando formas de replicar el comportamiento. Bajar la votación de una respuesta perfectamente correcta solo porque es una mala práctica situacional es muy incorrecta ya que no nos dieron un caso de uso completo para decidir. Así que realmente espero que ese no fuera el razonamiento detrás de -1. – Inoryy

-2

Acceso al contenedor de servicios en una clase personalizada (no en una clase definida de servicio)

Ésta no es la mejor práctica para hacerlo, pero funciona. Si la clase personalizada no está dispuesto a ser un servicio a continuación, se puede acceder al contenedor de servicios mediante la variable $ global del núcleo:

class Helper { 

    private $container; 

    /** 
    * Constructor assigns service container to private container. 
    */ 
    public function __construct() { 

     global $kernel; 
     $this->container = $kernel->getContainer(); 

    } 

    function doSOmething() { 
     $someService = $this->container->get('service.name'); 
     // do something with someService ... 
    } 

} 
+0

omg, usar globales en Symfony no se ve muy bien – Eddie

+0

funciona ... así que esta es una solución válida, no es una buena práctica, pero todavía – DevWL

+0

"funciona" no es suficiente – Eddie

Cuestiones relacionadas