Ver índice de contenidos del libro

16.4. Parámetros de servicio

La creación de nuevos servicios (es decir, objetos) a través del contenedor es bastante sencilla. Los parámetros permiten que la definición de los servicios sea más organizada y flexible:

# app/config/config.yml
parameters:
    my_mailer.class:      Acme\HelloBundle\Mailer
    my_mailer.transport:  sendmail

services:
    my_mailer:
        class:        "%my_mailer.class%"
        arguments:    ["%my_mailer.transport%"]
<!-- app/config/config.xml -->
<parameters>
    <parameter key="my_mailer.class">Acme\HelloBundle\Mailer</parameter>
    <parameter key="my_mailer.transport">sendmail</parameter>
</parameters>
 
<services>
    <service id="my_mailer" class="%my_mailer.class%">
        <argument>%my_mailer.transport%</argument>
    </service>
</services>
// app/config/config.php
use Symfony\Component\DependencyInjection\Definition;
 
$container->setParameter('my_mailer.class', 'Acme\HelloBundle\Mailer');
$container->setParameter('my_mailer.transport', 'sendmail');
 
$container->setDefinition('my_mailer', new Definition(
    '%my_mailer.class%',
    array('%my_mailer.transport%')
));

El resultado final es exactamente el mismo que antes; la diferencia sólo está en cómo defines el servicio. Al encerrar las cadenas my_mailer.class y my_mailer.transport entre signos de porcentaje (%), el contenedor sabe que tiene que buscar dos parámetros de configuración con esos nombres. Cuando se construye el contenedor, se busca el valor de cada parámetro y se utiliza en la definición del servicio.

Nota Si utilizas una cadena de texto que empieza con el carácter @ en un archivo YAML, debes escaparlo añadiendo otro carácter @ (este comportamiento sólo está disponible a partir de Symfony 2.1):

# app/config/parameters.yml
parameters:
    # el valor utilizado por Symfony será "@securepass"
    mailer_password: "@@securepass"

Nota Si utilizas el signo de porcentaje en un parámetro o argumento, debes escaparlo con otro signo de porcentaje:

<argument type="string">http://symfony.com/?foo=%%s&bar=%%d</argument>

Advertencia Si se muestra una excepción de tipo ScopeWideningInjectionException al pasar el servicio request como argumento, consulta el artículo How to work with Scopes para entender mejor este problema y aprender cómo solucionarlo.

El propósito de los parámetros es proporcionar la configuración de los servicios. Obviamente, no pasa nada por definir los servicios de tu aplicación sin utilizar parámetros. En cualquier caso, los parámetros tienen varias ventajas:

  • Separan y organizan todas las opciones del servicio bajo una sola clave llamada parameters.
  • Los valores de los parámetros se pueden utilizar en varios servicios diferentes.
  • Cuando creas un servicio en un bundle, el uso de parámetros facilita la personalización del servicio en tu aplicación.

La opción de usar o no parámetros depende de ti. Los bundles de terceros de alta calidad siempre usan parámetros, ya que así sus servicios son más configurables. No obstante, es posible que para los servicios de tu aplicación no necesites la flexibilidad de los parámetros.

Los parámetros también pueden contener arrays de valores.