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

61

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

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

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

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

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

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

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

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

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

  • 0
    У меня была та же проблема, и мне пришлось использовать getRootDir (). Это действительно раздражает, что вы не можете получить полный путь к папке / web! :П
Теги:

9 ответов

48
Лучший ответ

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

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

  • 1
    Спасибо. Я собирался использовать метод getRootDir, если больше ничего не появлялось, кажется, это наиболее разумный и универсальный способ сделать это.
44

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

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

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

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

Вы также можете получить его из любого класса 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();
    
  • 0
    Спасибо за Ваш ответ. Но подвох в том, что я не единственный разработчик проекта, и я точно знаю, что некоторые из них не используют виртуальные хосты, а некоторые - и меня, в том числе. Таким образом, решение должно быть более универсальным, чем это ... Поэтому (и принимая во внимание второй ответ) я, вероятно, буду использовать метод getRootDir () как более универсальный.
  • 0
    Если вы хотите получить каталог без контекста запроса, он не будет работать, не так ли? Понравились команды?
13

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

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

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

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

$this->getParameter('web_dir');
11

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

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

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

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

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

10

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

define('WEB_DIRECTORY', __DIR__);

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

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

2

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

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

С Symfony 3.3,

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

0
$host = $request->server->get('HTTP_HOST');
$base = (!empty($request->server->get('BASE'))) ? $request->server->get('BASE') : '';
$getBaseUrl = $host.$base;
  • 0
    Разве это не для получения URL-адреса запроса, а не для пути файловой системы, как спросили?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню