Компоненты Symfony 4.1 - Проблемы внедрения зависимостей - PullRequest
0 голосов
/ 07 сентября 2018

Я рефакторинг старого приложения в PHP.

Я пытаюсь использовать компонент внедрения зависимостей Symphony для внедрения сервисов в контроллеры (или другие сервисы), но я не знаю, как этого добиться, потому что документация по симфонии больше подготовлена ​​для использования каркаса, чем компонентов каркаса.

У меня уже есть свое Ядро, Контейнер, который содержит все сервисы и контроллеры (контроллеры уже зарегистрированы как сервисы). Мои контроллеры расширяют AbstractController от symfony/frameworkbundle. Поэтому единственное, что я могу сейчас сделать, это:

Получить сервис из контейнера по $this->container->get('service_id'), но если сервис в конструкторе будет иметь класс в качестве параметра

public function __constructor(SomeClass $someClass)

тогда я получаю это исключение:

Служба или псевдоним App \ V2 \ Service \ TestService была удалена или встроена во время компиляции контейнера. Вам следует либо сделать его общедоступным, либо прекратить использование контейнера напрямую и использовать вместо него внедрение зависимостей.

Если я изменю конфигурацию, чтобы сделать все службы общедоступными, то:

Слишком мало аргументов для функции APP \ V2 \ Service \ TestService :: __ construct (), 0 передано и ожидается ровно 1

Я готовлю суть, чтобы лучше понять, о чем я говорю: https://gist.github.com/miedzwin/49bac1cc1d5270d3ba1bfcf700abf864

Может кто-нибудь немного помочь мне с реализацией DI с использованием компонентов Symfony (не Symfony framework)? Хорошего рабочего примера будет достаточно. Или просто, пожалуйста, оставьте свои замечания в моей сути, я пытаюсь это исправить.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

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

Symfony 4-way прост: автоматическое подключение всех служб и параметров, без ручной настройки (если это возможно)).

Чтобы применить это к вашему примеру, это будет наилучшая конфигурация для ваших нужд и Symfony 4:

services:
    _defaults:
        # pass service dependencies to constructors by default
        autowire: true

        # add known tags (for commands, event subscribers etc) by default
        autoconfigure: true

        # to make using tests, bin files and another simpler
        public: true

        # autowiring of string/array/int parameters to constructors
        # this fixes cases like "argument "$facebookUserId" of method "__construct()" has no type-hint, you should configure its value explicitly"
        bind:
            # $constructorVariableName: %parameter% in config
            $facebookUserId: '%facebook_user_id%'

    APP\V2\:
        resource: '../src/app/V2/*'
        exclude: '../src/app/V2/{Script, Trait}'

    # symfony services - you still have to setup 3rd paryt services manually
    Symfony\Component\DependencyInjection\ParameterBag\ContainerBag:
        arguments:
            - '@service_container'
    # ...


Где продолжитьЧтение

0 голосов
/ 07 сентября 2018

https://symfony.com/doc/current/service_container.html#fetching-and-using-services

Вам необходимо изменить настройки по умолчанию для вашей службы, чтобы сделать их общедоступными:

services:
    _defaults:
        public: true

Но более элегантный способ получить доступ к сервисам - внедрить их в действия контроллера:

public function myAction(Request $request, TestService $service)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...