Symfony 4, как правильно получить каталог корневого пути (или путь / src) из класса обслуживания?(ошибка: 'вызов функции-члена get () в null') - PullRequest
0 голосов
/ 25 февраля 2019

В Symfony 4 из контроллера я могу получить корневой путь моего проекта через:

// From a Controller Class, in the src/Controller dir

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// ...
Class myController extends Controller{
// ...
// in a public method
$rootDir = $this->get('kernel')->getRootDir();

Но как я могу получить корневой путь из класса обслуживания?Я попробовал этот (безобразный) способ

// From a Service Class, in the src/Service dir

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
// ...
Class myService extends Controller{
// ...
// in a public method
$rootDir = $this->get('kernel')->getRootDir();

Но когда я это сделал, я получаю ошибку:

"Call to a member function get() on null"

Почему это решение не работает?и есть ли более правильный способ?

Спасибо за любую помощь:)

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Мой подход такой же, но вы можете вставить ParameterBaginterface в конструктор, чтобы у вас был доступ ко всем параметрам.

И с этим вам не нужно определять сервис, потому что автопроводка делает вашу жизньпроще.

class MyService
{
    private $parmeterBag;

    public function __construct(ParameterBagInterface $parameterBag)
    {
        $this->parameterBag= $parameterBag;
    }
}

Теперь вы можете получить доступ к своим параметрам через $ this-> parameterBag-> get ('your_parameter');

0 голосов
/ 25 февраля 2019

Symfony предоставляет параметр kernel.project_dir, который можно использовать внутри контейнера служб, который вы можете добавить в службы или получить из контейнера (внутри контроллера):

$this->getParameter('kernel.project_dir');

В службе вы простовставьте его в конструктор:

class MyService
{
    private $projectDir;

    public function __construct(string $projectDir)
    {
        $this->projectDir = $projectDir;
    }
}

В вашей конфигурации вам может потребоваться убедиться, что строка передана правильно, либо установив ее непосредственно для этой конкретной службы:

# config/services.yaml

...

services:

    ...

    App\MyService:
        arguments:
            $projectDir: '%kernel.project_dir%'

В качестве альтернативы выможет связать этот параметр с именем переменной, так что конфигурация автоматически его распознает:

# config/services.yaml

...

services:
    _defaults:
        ...
        bind:
            $projectDir: '%kernel.project_dir%'

Тогда все службы (зарегистрированные в этом файле конфигурации), имеющие параметр $projectDir, получат значение изэтот параметр.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...