services parameter create container php symfony dependency-injection controller containers

php - parameter - symfony controller constructor



Verifique si está en modo "dev" dentro de un Controlador con Symfony2.x (4)

Cuando se utiliza el modo dev con una aplicación Symfony2.x , generalmente se trabaja en la configuración regional. Por lo tanto, dicha función no funciona como se espera (por ejemplo, intente obtener la IP actual en el host local). Esto podría ser un problema, por ejemplo, cuando intente utilizar dicho servicio web basado en IP. Por lo tanto, solo quiero saber cómo verificar dentro de un controlador si la aplicación Symfony2 se está ejecutando en modo dev o no . De esa forma, uno puede configurar el comportamiento del controlador dependiendo del modo.

¿Alguna idea?


A partir de Symfony 2.5 podría hacerse como:

$this->container->get(''kernel'')->getEnvironment();

Preguntar directamente a Kernel sobre su entorno parece mejor que buscar el parámetro.


Aquí está la versión 2017 y Symfony 3.3+ usando Constructor Injection .

En lugar de pasarle toda la aplicación (= contenedor), puede pasar solo el parámetro que necesita :

1. Configuración del servicio

# app/config/services.yml services: _defaults: autowire: true App/Controller/SomeController: arguments: [''%kernel.environment%'']

Si no entiende esta sintaxis, consulte esta publicación que explica las novedades de Symfony DI en ejemplos anteriores / posteriores .

2. El controlador

namespace App/Controller; final class SomeController { /** * @var string */ private $environment; public function __construct(string $environment) { $this->environment = $environment; } public function someAction() { $this->environment... // any operations you need } }


¿Por qué evitar pasar el contenedor en el controlador?

Lo más importante en el código es la consistencia .

  • Si prefiere localizadores estáticos y de servicio (= servicio que puede pasar a cualquier parte para obtener otro servicio), úselos.

  • Si prefiere la inyección de constructor, el gráfico de dependencia de árbol (! = Dependencias circulares), úselo.

Mezclar este concepto podría estar bien para ti, si sabes por qué los usaste de esa manera. Pero aquí viene a jugar The Broken Window Theory (versión muy bien descrita por Coding Horror) . Cualquiera que acceda al código más probablemente escogerá la versión que no está destinada a usar de esa manera .

La ambigüedad en el código es la primera invitación al código heredado

He sido mentor de equipos de muchas aplicaciones, que comenzaron con un simple $this->container en el código y después de un par de años terminaron pidiéndome ayuda, cómo reescribir o refactorizar todo el infierno estático.


Como desea saber si está en modo dev (no necesariamente el entorno llamado "dev"), puede recuperar el kernel del contenedor de servicio y verificar el isDebug método isDebug :

$kernel = $this->get(''kernel''); $devMode = $kernel->isDebug();

Como se señala en la documentación (el énfasis es mío),

Importante, pero no relacionado con el tema de los entornos es el argumento true o false como el segundo argumento para el constructor AppKernel . Esto especifica si la aplicación debe ejecutarse en "modo de depuración". Independientemente del entorno, una aplicación Symfony se puede ejecutar con el modo de depuración establecido en verdadero o falso . Esto afecta muchas cosas en la aplicación, como mostrar trazas de pila en páginas de error o si los archivos de caché se reconstruyen dinámicamente en cada solicitud. Aunque no es un requisito, el modo de depuración generalmente se establece en verdadero para los entornos de desarrollo y prueba y falso para el entorno de prueba.

Internamente, el valor del modo de depuración se convierte en el parámetro kernel.debug utilizado dentro del contenedor de servicio.


Para obtener el entorno actual en un Controller , puede usar:

$this->container->getParameter(''kernel.environment'');

Entonces simplemente póngalo en una declaración if() para verificar si es igual a dev .