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

22
demandé sur j0k 2012-05-17 21:51:37

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.

45
répondu Peter Bailey 2012-05-17 19:00:45

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');

Voir Noyau.classe php sur github

18
répondu Francesco Casula 2015-05-05 10:23:42

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 ;)

2
répondu Steve Childs 2016-10-04 09:42:22