En el controlador, lo que podía hacer¿Cómo consigo servicios (dependencias) en una clase personalizada
$this->get('service.name')
Pero en una clase personalizada, ¿cómo puedo hacer eso?
En el controlador, lo que podía hacer¿Cómo consigo servicios (dependencias) en una clase personalizada
$this->get('service.name')
Pero en una clase personalizada, ¿cómo puedo hacer eso?
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.
OK supongo @Arms respuesta es una solución posible, encontrar buscando en la fuente a Controller
, que podría extenderse ContainerAware
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;
}
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
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) –
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
Si no conoce la lista completa de las dependencias que necesita en el momento en que se crea el servicio, puede pasar el contenedor como el argumento http://symfony.com/doc/current/book/service_container.html#using-the-expression-language
services:
service_name:
class: AppBundle\Class
arguments: ['@=container']
É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 ...
}
}
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. –
Inyectar todo el contenedor es una mala idea. Inyecte explícitamente cada servicio que necesita en su servicio. –