Working with Container Service Definitions

Obteniendo y estableciendo definiciones de servicios

There are some helpful methods for working with the service definitions.

Para saber si hay una definición para un ID de servicio:

$container->hasDefinition($serviceId);

Esto es útil si sólo quieres hacer algo si existe una definición particular.

Puedes recuperar una definición con:

$container->getDefinition($serviceId);

o:

$container->findDefinition($serviceId);

que a diferencia de getDefinition() también resuelve los alias de manera tal que si el argumento $serviceId es un alias esta recuperará la definición subyacente.

Las definiciones de servicios en sí mismas son objetos, por tanto, si recuperas una definición de dichos métodos y les haces cambios se verán reflejados en el contenedor. Sin embargo, si estás creando una nueva definición, entonces lo puedes añadir al contenedor usando:

$container->setDefinition($id, $definition);

Trabajando con una definición

Creando una nueva definición

Si necesitas crear una nueva definición en lugar de manipular una recuperada desde ese contenedor, entonces la clase de la definición es Symfony\Component\DependencyInjection\Definition.

Clase

En primer lugar es la clase de una definición, ésta es la clase del objeto devuelto cuando solicitas el servicio desde el contenedor.

Para determinar qué clase dicta la definición:

$definition->getClass();

y para establecer una clase diferente:

$definition->setClass($class); // nombre de clase completamente cualificado como cadena

Argumentos del constructor

Para obtener un arreglo de los argumentos del constructor para una definición puedes usar:

$definition->getArguments();

o para obtener un solo argumento por posición:

$definition->getArgument($index);
// p. ej. $definition->getArguments(0) para el primer argumento

Puedes agregar un nuevo argumento al final del arreglo de argumentos usando:

$definition->addArgument($argument);

El argumento puede ser una cadena, un arreglo, un parámetro de servicio usando %paramater_name% o un identificador de servicio usando:

use Symfony\Component\DependencyInjection\Reference;

// ...

$definition->addArgument(new Reference('service_id'));

De manera similar puedes sustituir un argumento ya establecido por índice usando:

$definition->replaceArgument($index, $argument);

También puedes reemplazar todos los argumentos (o establecer alguno si no hay) con un arreglo de argumentos:

$definition->replaceArguments($arguments);

Llamadas a método

Si el servicio en que estás trabajando usa la inyección de definidores entonces puedes manipular cualquier llamada a método en las definiciones también.

Puedes obtener un arreglo de todas las llamadas al método con:

$definition->getMethodCalls();

Añade una llamada al método con:

$definition->addMethodCall($method, $arguments);

Donde $method es el nombre del método y $arguments es un arreglo de los argumentos con los cuales llamar al método. Los argumentos pueden ser cadenas, arreglos, parámetros o identificadores de servicio al igual que los argumentos del constructor.

También puedes sustituir cualquier llamada existente a un método con un arreglo de otras nuevas con:

$definition->setMethodCalls($methodCalls);

Truco

Hay más ejemplos de maneras específicas de trabajar con definiciones en los bloques de código PHP de los ejemplos de configuración en páginas como Usando el patrón factoría para crear servicios y Gestionando dependencias comunes con servicios padre.

Nota

The methods here that change service definitions can only be used before the container is compiled, once the container is compiled you cannot manipulate service definitions further. To learn more about compiling the container see Compilando el contenedor.

Bifúrcame en GitHub