Parámetros de services en Symfony

Los parámetros de services en Symfony se pueden configurar y obtenerse de diferentes formas y en diferentes formatos

Contenido modificable

Si ves errores o quieres modificar/añadir contenidos, puedes crear un pull request. Gracias

Puedes definir parámetros en el service container que pueden usarse directamente o como parte de las definiciones de services, lo que puede ser útil para separar valores que crees cambiar más a menudo.

Obtener y establecer parámetros

Trabajar con parámetros del container es sencillo con los métodos del contenedor para parámetros.

Para comprobar si se ha definido un parámetro:

$container->hasParameter('mailer.transport');

Para obtener un parámetro:

$container->getParameter('mailer.transport');

Para establecer un parámetro:

$container->setParameter('mailer.transport', 'sendmail');

Sólo se puede definir un parámetro antes de que se compile el container.

Parámetros en archivos de configuración

También se pueden establecer parámetros desde un archivo de configuración:

parameters:
    mailer.transport: sendmail

Puedes hacer referencia a estos parámetros en otras partes con el símbolo de porcentaje %, %mailer.transport%. Un uso de esto es inyectar los valores en tus services. Esto te permite configurar diferentes versiones de services entre aplicaciones o multiple services basados en la misma clase pero configurados de forma diferente dentro de una aplicación.

Podrías por ejemplo inyectar el mail transport directamente en la clase Mailer, pero declararlo como parámetro lo hace más fácil de cambiar:

parameters:
    mailer.transport: sendmail

services:
    mailer:
        class:     Mailer
        arguments: ['%mailer.transport%']

Los valores entre las etiquetas parámeter en archivos de configuración XML no se ajustan con trim.

Esto significa que una configuración como esta:

<parameter key="mailer.transport">
    sendmail
</parameter>

Se traduce en \n sendmail\n. Para evitar esto conviene establecer los parámetros ajustados:

<parameter key="mailer.transport">sendmail</parameter>

Parámetros array

Los parámetros no tienen por qué ser sólo strings, pueden también contener arrays:

parameters:
    my_mailer.gateways:
        - mail1
        - mail2
        - mail3
    my_multilang.language_fallback:
        en:
            - en
            - fr
        fr:
            - fr
            - en

Constantes como parámetros

El container también soporta establecer constantes PHP como parámetros. Esta funcionalidad sólo está disponible en configuración XML o PHP.

<?xml version="1.0" encoding="UTF-8" ?>
<container xmlns="http://symfony.com/schema/dic/services"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <parameters>
        <parameter key="global.constant.value" type="constant">GLOBAL_CONSTANT</parameter>
        <parameter key="my_class.constant.value" type="constant">My_Class::CONSTANT_NAME</parameter>
    </parameters>
</container>

Si empleas normalmente YAML y quieres esta funcionalidad, puedes importar una configuración XML así:

imports:
    - { resource: parameters.xml }

Palabras PHP en XML

Por defecto, true, false y null en XML se convierten a las palabras en PHP true, false y null.

<parameters>
    <parameter key="mailer.send_all_in_once">false</parameter>
</parameters>

<!-- after parsing
$container->getParameter('mailer.send_all_in_once'); // devuelve false
-->

Para desactivar este comportamiento, emplea el type string:

<parameters>
    <parameter key="mailer.some_parameter" type="string">true</parameter>
</parameters>

<!-- after parsing
$container->getParameter('mailer.some_parameter'); // devuelve "true"
-->

Esto no es un problema en YAML o PHP, ya que tienen soporte incorporado para palabras PHP.