В Symfony AppKernel
класс обрабатывает корневой каталог проекта по методу getProjectDir()
.Чтобы получить его в контроллере, вы можете сделать:
$projectRoot = $this->get('kernel')->getProjectDir();
он вернет вам корневой каталог проекта.
Если вам нужен корневой каталог проекта в одном из ваших классов, у вас есть два вариантакоторую я тебе подарю.Сначала передается AppKernel
как зависимость:
class Foo
{
/** KernelInterface $appKernel */
private $appKernel;
public function __construct(KernelInterface $appKernel)
{
$this->appKernel = $appKernel;
}
}
Благодаря зависимостям автопроводки Symfony 4 он будет автоматически введен в ваш класс, и вы сможете получить к нему доступ, выполнив:
$this->appKernel->getProjectDir();
Но пожалуйста, обратите внимание : Я не думаю, что это хорошая идея, пока у вас нет реальной необходимости и больше делать с классом AppKernel
, чем получение корневого каталога проекта.Особенно, если вы подумаете о создании модульных тестов для вашего класса.Вы автоматически увеличите сложность, например, при необходимости создать макет AppKernel
.
Второй вариант, и IMHO лучше будет передать только строку с путем к каталогу.Вы можете достичь этого, определив службу внутри config/services.yaml
следующим образом:
services:
(...)
MyNamespace\Foo:
arguments:
- %kernel.project_dir%
, и ваш конструктор будет выглядеть так:
class Foo
{
/** string $rootPath */
private $rootPath;
public function __construct(string $rootPath)
{
$this->rootPath = $rootPath;
}
}