Каков наилучший способ получить корневой каталог приложения внутри контроллера? Возможно ли получить его вне контроллера?
Теперь я получаю его, передавая его (из параметров) в службу в качестве аргумента, например:
services:
sr_processor:
class: Pro\Processor
arguments: [%kernel.root_dir%]
Есть ли лучший, более простой способ получить эту информацию в Symfony2?
Используйте это:
$this->get('kernel')->getRootDir();
И если вы хотите веб root:
$this->get('kernel')->getRootDir() . '/../web' . $this->getRequest()->getBasePath();
это будет работать из метода действий контроллера...
EDIT: Что касается услуг, я думаю, что способ, которым вы это делали, настолько чист, насколько это возможно, хотя я бы передал полную службу ядра в качестве аргумента... но это также будет делать трюк...
$this->get('kernel')->getRootDir() . '/../..' . $this->getRequest()->getBasePath();
2.0
-> 2.2
. Была ли изменена структура каталогов в 2.3
или master
?
Если вы используете этот путь для доступа к частям проектов, которые не являются кодом (например, каталогом загрузки или базой данных SQLite), тогда было бы лучше включить путь в параметр, например:
parameters:
database_path: '%kernel.root_dir%/../var/sqlite3.db'
Этот параметр можно вводить везде, где он вам нужен, поэтому вам больше не придется путаться с путями в коде. Кроме того, параметр может быть переопределен во время развертывания. Наконец, каждый поддерживающий программист будет лучше понимать, для чего вы его используете.
Обновление: Исправлено постоянное использование kernel.root_dir.
В дополнение к этому вы также можете использовать регулярное выражение:
$directoryPath = $this->container->getParameter('kernel.root_dir') . '/../web/bundles/yourbundle/';
$directoryPath = preg_replace("/app..../i", "", $directoryPath);
echo $directoryPath;
В Symfony 3.3 вы можете использовать
$projectRoot = $this->get('kernel')->getProjectDir();
чтобы получить корень сети/проекта.