Вопрос заключается в следующем:
Как я могу получить путь к веб-каталогу в Symfony2 изнутри контроллера (или из другого источника по этой причине)
То, что я уже нашел (также, выполнив поиск здесь):
Это рекомендуется в статье поваренной книги об обработке файлов Doctrine
$path = __DIR__ . '/../../../../web';
Найденный путем поиска вокруг, можно использовать только внутри контроллера (или службы с ядром):
$path = $this->get('kernel')->getRootDir() . '/../web';
Итак, нет абсолютно никакого способа получить хотя бы эту «веб-часть» пути? Что, если я, например, решил переименовать или переместить или что-то еще?
Все было легко в первом symfony, когда я мог получить все, что мне нужно, из любого места в коде, вызвав статический метод sfConfig :: get ().
На самом деле нет прямого способа получить путь к 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 (fi 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();
ОБНОВЛЕНИЕ: Начиная с 2.8, это больше не работает, потому что по умолчанию утиль больше не включается. Хотя, если вы используете assetic, это будет работать.
Вы можете использовать переменную %assetic.write_to%.
$this->getParameter('assetic.write_to');
Поскольку ваши активы зависят от этой переменной, которая будет сбрасываться в ваш веб-каталог, можно безопасно предположить и использовать, чтобы найти свою веб-папку.
http://symfony.com/doc/current/reference/configuration/assetic.html
Мое решение состоит в том, чтобы добавить этот код в app.php
define('WEB_DIRECTORY', __DIR__);
Проблема заключается в том, что в командной строке код, который использует константу, сломается. Вы также можете добавить константу в файл приложения / консоли и другие внешние контроллеры среды
Другим решением может быть добавление статического метода в AppKernel, который возвращает DIR . '/ .. / web /' Таким образом, вы можете получить доступ во всем мире
Вы находитесь на Symfony, подумайте «Injection of Dependency» ^^
Во всем моем проекте SF, я делаю в параметрах.yml:
web_dir: "%kernel.root_dir%/../web"
Поэтому я могу безопасно использовать этот параметр в контроллере:
$this->getParameter('web_dir');
Для Symfony3 В контроллере попробуйте
$request->server->get('DOCUMENT_ROOT').$request->getBasePath()
$host = $request->server->get('HTTP_HOST'); $base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : ''; $getBaseUrl = $host.$base;