Подтвердить что ты не робот

Как получить путь к серверу в веб-каталоге Symfony2 изнутри контроллера?

Вопрос заключается в следующем:

Как я могу получить путь сервера к веб-каталогу в Symfony2 изнутри контроллера (или из другого места по этой причине)

Что я уже нашел (также, выполнив поиск здесь):

Это рекомендуется в статье поваренной книги об обработке файлов Doctrine

$path = __DIR__ . '/../../../../web';

Найденный путем поиска вокруг, доступен только изнутри контроллера (или службы с ядром):

$path = $this->get('kernel')->getRootDir() . '/../web';

Итак, нет абсолютно никакого способа получить хотя бы эту "веб-часть" пути? Что, если я, например, решил переименовать или переместить или что-то еще?

Все было легко в первом symfony, когда я мог получить все, что мне нужно, из любого места в коде, вызвав статический метод sfConfig:: get().

4b9b3361

Ответ 1

На самом деле нет прямого способа получить путь к webdir в Symfony2, поскольку структура полностью не зависит от webdir.

Вы можете использовать getRootDir() в экземпляре класса ядра, как и вы пишете. Если вы планируете переименовать dir в будущем, вы должны настроить его. Например, AsseticBundle имеет такую ​​опцию в конфигурации DI (см. здесь и здесь).

Ответ 2

Чтобы получить доступ к корневому каталогу вне контроллера, вы можете просто вставить %kernel.root_dir% в качестве аргумента в настройку своих сервисов.

service_name:
    class: Namespace\Bundle\etc
    arguments: ['%kernel.root_dir%']

Затем вы можете получить корневой веб-сайт в конструкторе класса:

public function __construct($rootDir)
{
    $this->webRoot = realpath($rootDir . '/../web');
}

Ответ 3

Вы также можете получить его из любого класса ContainerAware (f.i. Controller) из службы запросов:

  • Если вы используете apache как веб-сервер (я полагаю, для других webservers решение будет аналогичным) и используют 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();
    

Ответ 4

Вы находитесь на Symfony, подумайте "Injection of Dependency" ^^

Во всем моем проекте SF, я делаю в параметрах .yml:

web_dir: "%kernel.root_dir%/../web"

Поэтому я могу безопасно использовать этот параметр в контроллере:

$this->getParameter('web_dir');

Ответ 5

ОБНОВЛЕНИЕ: Начиная с 2.8, это больше не работает, потому что по умолчанию утиль больше не включается. Хотя, если вы используете assetic, это будет работать.

Вы можете использовать переменную %assetic.write_to%.

$this->getParameter('assetic.write_to');

Поскольку ваши активы зависят от этой переменной, которую нужно сбрасывать в ваш веб-каталог, ее можно безопасно предполагать и использовать для поиска вашей веб-папки.

http://symfony.com/doc/current/reference/configuration/assetic.html

Ответ 6

Мое решение состоит в том, чтобы добавить этот код в app.php

define('WEB_DIRECTORY', __DIR__);

Проблема заключается в том, что в командной строке код, который использует константу, сломается. Вы также можете добавить константу в файл приложения/консоли и другие внешние контроллеры среды

Другим решением может быть добавление статического метода в AppKernel, который возвращает DIR. '/../web/' Таким образом, вы можете получить доступ во всем мире

Ответ 7

Для Symfony3 В контроллере попробуйте

$request->server->get('DOCUMENT_ROOT').$request->getBasePath()

Ответ 8

$host = $request->server->get('HTTP_HOST');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $host.$base;

Ответ 9

С Symfony 3.3,

Вы можете использовать %kernel.project_dir%/web/ вместо %kernel.root_dir%/../web/