Symfony 4, получить корневой путь проекта из пользовательского класса (не класса контроллера) - PullRequest
0 голосов
/ 17 октября 2018

В каталоге src / Utils я создал собственный класс Foo для различных вещей.Я ищу способ получить абсолютный корневой путь проекта Symfony 4

Из контроллера, это легко с:

$webPath = $this->get('kernel')->getProjectDir();

Но из пользовательского класса, который я создал в моемКаталог src / Utils, как я могу получить каталог корневого пути?

Я мог бы передать путь от контроллера к классу Foo :

$webPath = $this->get('kernel')->getProjectDir();
$faa = new Foo($webPath);
$faa->doSomething();

, но я считаю более правильным хранить эту информацию в классе Foo и иметьединственная «логика контроллера» в классе контроллеров

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

В 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;
    }
}
0 голосов
/ 17 октября 2018

Это работа:

// from Foo class
use Symfony\Component\HttpKernel\KernelInterface;
...
class Foo{
    private $rootDir;
    public function __construct(KernelInterface $kernel)
    {
        $this->rootDir = $kernel->getProjectDir();
    }
    public function myfoomethod(){
        return $this->getRootDir();
    }
    public function getRootDir(){
        return $this->rootDir;
    }
}


// from the controller class 
use App\Utils\Foo;
...
class FaaController extends AbstractController
{
    /**
     * @Route("/scenario", name="scenario")
     */
    public function new(Foo $foo)
    {
        dump($foo->myfoomethod()); //show the dir path !
        return $this->render('faa/index.html.twig');
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...