Accès à la variable D'environnement AppKernel dans symfony 2
J'utilise symfony 2 et nous avons 2 configurations, dev et prod. J'ai besoin de savoir si je peux savoir lequel je l'utilise à l'intérieur d'une entité ou D'un modèle.
Je cherche quelque chose de similaire à ce code trouvé dans AppKernel.php:
$this->getEnvironment()
Si je pouvais charger le noyau pour appeler cela, ce serait génial mais je ne peux pas trouver un moyen de le faire. Après avoir regardé cela il semble que les événements symfony peuvent renvoyer le noyau mais je ne sais pas comment ou où capturer ces événements afin que je puisse appeler getKernel () sur eux. http://symfony.com/doc/current/book/internals.html
Par exemple, ils listent cet exemple:
Utilisez SymfonyComponentHttpKernelEvent FilterControllerEvent;
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
// ...
// the controller can be changed to any PHP callable
$event->setController($controller);
}
Je ne sais pas où mettre ce bloc de code. Il me semble que cela devrait aller dans le noyau, et si j'avais le noyau, Je n'aurais pas ce problème.
Ma question Est, existe-t-il un moyen facile pour moi de déterminer si je suis dans ' dev ' ou 'prod' comme défini dans le noyau, à partir d'un Service ou d'un Modèle. Merci
3 réponses
Les classes d'entités par défaut générées par la console n'héritent de rien. Cela signifie qu'ils ne sont en aucun cas "ContainerAware".
Et d'une manière générale, je ne pense pas qu'ils devraient l'être. Je suppose que cela dépend de ce que vous faites mais vous pouvez gérer cela avec l'injection de dépendance
Dans un contrôleur:
$entity = new \Your\Bundle\Entity\Foo(
$this->container->get( 'kernel' )->getEnvironment()
);
Puis dans src/Votre/Bundle/Entité/Foo.php
private $env;
public function __construct( $env=null )
{
$this->env = $env;
}
Cela fonctionnerait-il pour vous?
PS l'écouteur d'événement vous posté à propos est pour les contrôleurs - pas pour les classes arbitraires.
Il est également possible d'obtenir cela en tant que paramètre. Si vous jetez un oeil à la classe \Symfony\Component\HttpKernel\Kernel
, vous trouverez une méthode getKernelParameters()
qui expose tous les paramètres du noyau.
/**
* Returns the kernel parameters.
*
* @return array An array of kernel parameters
*/
protected function getKernelParameters()
{
$bundles = array();
foreach ($this->bundles as $name => $bundle) {
$bundles[$name] = get_class($bundle);
}
return array_merge(
array(
'kernel.root_dir' => realpath($this->rootDir) ?: $this->rootDir,
'kernel.environment' => $this->environment,
'kernel.debug' => $this->debug,
'kernel.name' => $this->name,
'kernel.cache_dir' => realpath($this->getCacheDir()) ?: $this->getCacheDir(),
'kernel.logs_dir' => realpath($this->getLogDir()) ?: $this->getLogDir(),
'kernel.bundles' => $bundles,
'kernel.charset' => $this->getCharset(),
'kernel.container_class' => $this->getContainerClass(),
),
$this->getEnvParameters()
);
}
Pour un services.yml
fichier, vous pouvez obtenir de l'environnement avec %kernel.environment%
, tandis que dans un conteneur de conscience de classe, vous pouvez l'obtenir en faisant:
$this->getContainer()->getParameter('kernel.environment');
Bien sûr, il y a la manière rapide et sale des globals...
function quickAndDirty() {
global $kernel;
if ($kernel->getEnvironment() == 'dev') {
// we're in dev mode
}
}
C'est mauvais et mauvais et vous devriez vous laver après l'avoir utilisé, mais dans le cas d'une grande base de code existante que vous avez peut-être héritée, cela sauve un cauchemar de refactoring potentiel.
Bien sûr, si vous pouvez vivre avec vous-même après avoir utilisé une telle méthode, c'est à vous ;)