Symfony 4.2 - Услуги / Автосоединение - вызов метода на основе значения контроллера - PullRequest
0 голосов
/ 12 января 2019

В Symfony 4.2 класс Controller устарел, и вы должны переключиться на AbstractController и, следовательно, больше не иметь доступа к функциональности $this->get('service.name'), за исключением нескольких служб, которые они для вас определяют.

Мой базовый контроллер расширяет контроллер Symfony и имеет функцию, которая использует функциональность $this->get:

public function getRepository($repository){
    $repo = $this->get($repository);
    if($this->authRepository !== null) {
        $repo->setPrefix($this->authRepository);
    }
    return $repo;
}

Так что в моем контроллере я могу сказать что-то вроде $this->getRepository('api.service');, и тогда он загрузит мой сервис, установит префикс на основе запроса, а затем вернет настроенный api.service.

С новым AbstractController и autowiring / auto-инъекцией сервисов, как я могу сказать своему сервису не только вызывать метод setPrefix (который я знаю, что могу сделать), но и сказать ему использовать параметр в моем контроллере?

Конфигурация на данный момент:

api.service:
    class: App\ApiService
    calls:
        - method: setPrefix
          arguments:
              - '??????'

1 Ответ

0 голосов
/ 12 января 2019

Так что этот метод, как вы разместили выше:

public function getRepository($repository){
    $repo = $this->get($repository);
    if($this->authRepository !== null) {
        $repo->setPrefix($this->authRepository);
    }
    return $repo;
}

Может быть реализовано так с новым DependecyInjection:

class TestController extends AbstractController
{
    /**
     * @Route("/test", name="test")
     */
    public function test(App\ApiService $service)
    {
        $service->maybeSetPrefix($service);
        $service->call(...
    }

    // this can go into your own BaseController
    public function maybeSetPrefix($service)
    {
        if ($this->authRepository !== null) {
            $service->setPrefix($this->authRepository);
        }
    }
}

Вы бы не нуждались бы в определении сервиса, потому что Symfony DependencyInjection уже должно автоматически связать это, но вручную это будет выглядеть так:

App\ApiService:
    autowire: true
    autoconfigure: true
    public: false

Так что теперь мы больше не используем идентификаторы сервисов, такие как api.service, а полное имя класса App\ApiService.

Если вы все еще хотите оставить службу доступной с помощью api.service, вы можете дополнительно добавить определение службы псевдонима:

api.service:
    alias: App\ApiService
    public: true

Но, возможно, в вашем случае вы могли бы позволить вашему App\ApiService решить, как инициализировать себя на основе запроса вместо контроллера, как это:

class ApiService
{
    public function __construct(RequestStack $requestStack, AuthRepository $authRepository)
    {
        $request = $requestStack->getCurrentRequest();

        if ($request->get('option') === 'test') {
            $this->setPrefix($authRepository);
        }
    }

Возможно, опубликуйте более подробную информацию или пример кода вашей текущей логики контроллера, если это не поможет.

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