Как получить путь сервера к веб-каталогу в Symfony2 изнутри контроллера?
вопрос следующий:
Как я могу получить путь сервера к веб-каталогу в Symfony2 изнутри контроллера (или из любого другого места по этой причине)
что я уже нашел (также, поискав здесь):
это рекомендуется в статье поваренной книги по обработке файлов доктрины
$path = __DIR__ . '/../../../../web';
найдено путем поиска вокруг, можно использовать только изнутри контроллера (или службы с ядром вводится):
$path = $this->get('kernel')->getRootDir() . '/../web';
Так, нет ли абсолютно никакого способа получить хотя бы эту "веб-часть пути"? Что, если я, например, решил переименовать его или переместить или что-то еще?
все было легко в первой symfony, когда я мог получить все, что мне нужно, из любой точки кода, вызвав статический метод sfConfig::get ()..
8 ответов:
на самом деле нет прямого способа получить путь к webdir в Symfony2, поскольку фреймворк полностью независим от webdir.
можно использовать
getRootDir()
на экземпляре класса ядра, так же, как вы пишете. Если вы рассматриваете переименование/web
реж в будущем, вы должны сделать его настраиваемым. Например AsseticBundle имеет такую опцию в своей конфигурации DI (см. здесь и здесь).
для доступа к корневому каталогу из-за пределов контроллера вы можете просто ввести
%kernel.root_dir%
в качестве аргумента в настройки служб.service_name: class: Namespace\Bundle\etc arguments: ['%kernel.root_dir%']
затем вы можете получить веб-корень в конструкторе класса:
public function __construct($rootDir) { $this->webRoot = realpath($rootDir . '/../web'); }
вы также можете получить его из любого класса ContainerAware (F. I. Controller) из службы запросов:
если вы используете apache в качестве веб-сервера (я полагаю, для других веб-серверы решение будет аналогично) и используют virtualhosting (ваши URL-адреса выглядят так -
localhost/app.php
затем вы можете использовать:$container->get('request')->server->get('DOCUMENT_ROOT'); // in controller: $this->getRequest()->server->get('DOCUMENT_ROOT');
Else (ваши URL-адреса выглядят так -
localhost/path/to/Symfony/web/app.php
:$container->get('request')->getBasePath(); // in controller: $this->getRequest()->getBasePath();
вы находитесь на Symfony, подумайте "инъекция зависимости"^^
во всем моем проекте SF, я делаю в параметрах.yml:
web_dir: "%kernel.root_dir%/../web"
поэтому я могу безопасно использовать этот параметр в контроллере:
$this->getParameter('web_dir');
обновление: с 2.8 это больше не работает, потому что assetic больше не включен по умолчанию. Хотя если вы используете assetic это будет работать.
Вы можете использовать переменную
%assetic.write_to%.
$this->getParameter('assetic.write_to');
http://symfony.com/doc/current/reference/configuration/assetic.html
мое решение-добавить этот код в приложение.php
define('WEB_DIRECTORY', __DIR__);
проблема в том, что в коде командной строки, который использует константу, произойдет разрыв. Вы также можете добавить константу в файл приложения / консоли и другие интерфейсные контроллеры среды
другим решением может быть добавление статического метода в AppKernel, который возвращает реж.'/../сеть'/ Так что вы можете получить доступ везде