Muchas aplicaciones Symfony 2 son multiidioma gracias a la capacidad del popular framework para manejar las traducciones. En este contexto la variable locale contendrá el identificador del idioma. Desde el controlador es muy sencillo obtener el locale a partir del request; basta pedirlo: $this->get('request')->getLocale(). En cambio no es tan sencillo inyectar el locale en el constructor de un servicio debido a los diferentes ámbitos (scopes) que pueden tener los servicios.
Sin embargo hay un truco para hacerlo:
<service
id="mylocale"
class="Symfony\Component\HttpFoundation\Request"
factory-service="request"
factory-method="getLocale">
</service>
<service
id="myservice"
class="%myservice.class%">
<argument type="service" id="mylocale" on-invalid="null" />
</service>
Es decir, primero creamos un service factory que acceda al Request para obtener el locale y luego inyectamos el service factory en nuestro servicio. el parámetro on-invalid="null" es muy importante para solucionar aquellos casos en que el Request no existe; como por ejemplo los comandos de consola. Al implementar la clase hay que tener en cuenta que es posible que recibamos null en lugar del locale.
class MyService
{
/**
* @var string
*/
private $locale;
/**
* @param string $locale
*/
public function __construct($locale = null)
{
$this->locale = $locale;
}
// (...)
}

No hay comentarios:
Publicar un comentario