Intereting Posts
Функция, которая создает новую переменную для использования вне функции – PHP ajax и php для ввода нескольких форм, вводимых в базу данных Можно ли установить лимит в выпадающем списке с несколькими выборами? Поддержание состояния между прогонами | Использование сеанса Как вы будете кэшировать контент в проекте MVC? вырезать текст после (x) количества символов создание приложений на основе ролей УДАЛЕНИЕ любой записи в любой таблице в базе данных, если feildx = 123 Mysql to Mysqli Ошибка установки сервера Apache (порт 80 или 443 уже используется) как сделать содержимое таблицы wil автоматически отображаемым в всплывающей форме L5 random TokenMismatchExceptions PHP: использование сообщения, когда поля mutliple form имеют одинаковое имя и идентификатор Исключение странных страниц с .htaccess Почему использование подготовленного оператора mysql более безопасно, чем использование общих функций эвакуации?

Доступ к переменной среды AppKernel в symfony 2

Я использую symfony 2, и у нас есть 2 конфигурации, dev и prod. Мне нужно знать, могу ли я узнать, какой из них использовать внутри Entity или Model.

Я ищу что-то похожее на этот код, найденный в AppKernel.php:

$this->getEnvironment() 

Если бы я мог загрузить Ядро, чтобы назвать это, это было бы здорово, но я не могу найти способ сделать это. Изучив это, выяснилось, что события symfony могут возвращать Ядро, но я не знаю, как и где можно захватить эти события, чтобы я мог называть getKernel () на них. http://symfony.com/doc/current/book/internals.html

Например, они перечисляют этот пример:

используйте Symfony \ Component \ HttpKernel \ Event \ FilterControllerEvent;

 public function onKernelController(FilterControllerEvent $event) { $controller = $event->getController(); // ... // the controller can be changed to any PHP callable $event->setController($controller); } 

Его неясно, куда поставить этот блок кода. Мне кажется, что он должен идти в Ядре, и если бы у меня было Ядро, у меня не было бы этой проблемы.

Мой вопрос в том, есть ли простой способ для меня определить, есть ли я в «dev» или «prod», как установлено в ядре, из Сервиса или Модели. благодаря

Класс сущности по умолчанию, сгенерированный консолью, не наследует ничего. Это означает, что они не являются «ContainerAware».

И вообще, я не думаю, что они должны быть. Я полагаю, что это зависит от того, что вы делаете, но вы можете справиться с этим с помощью некоторой базовой инъекции зависимостей

В контроллере:

 $entity = new \Your\Bundle\Entity\Foo( $this->container->get( 'kernel' )->getEnvironment() ); 

И затем в src / Your / Bundle / Entity / Foo.php

 private $env; public function __construct( $env=null ) { $this->env = $env; } 

Будет ли это работать для вас?

PS Слушатель событий, о котором вы писали, для контроллеров – не для произвольных классов.

Это также можно получить в качестве параметра. Если вы посмотрите на класс \Symfony\Component\HttpKernel\Kernel вы найдете метод getKernelParameters() который предоставляет все параметры ядра.

 /** * 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() ); } 

Таким образом, в файле services.yml вы можете получить среду с %kernel.environment% , в то время как в классе, поддерживающем контейнер, вы можете получить его:

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

см. класс Kernel.php на github

Конечно, есть быстрый и грязный способ глобализации …

 function quickAndDirty() { global $kernel; if ($kernel->getEnvironment() == 'dev') { // we're in dev mode } } 

Его плохое и злое, и вы должны помыться после его использования, но в случае большой существующей кодовой базы, которую вы, возможно, унаследовали, она экономит потенциальный кошмар рефакторинга.

Конечно, независимо от того, можете ли вы жить с самим собой после использования такого метода, зависит от вас;)