yaleksandr89
@yaleksandr89
PHP developer

Как правильно передать скалярные параметры в сервис (проект Symfony)?

Здравствуйте.

Давненько не работал с Symfony, не могу побороть один момент, всю голову уже сломал. Хочу в качестве теста реализовать следующее:
  1. Создать тестовый бандл в Symfony (src/TestBundle). Знаю бэд практик, но очень нужно :)
  2. Внутри бандла создать сервис в конструктор которого хочу передать скалярные 2 текстовых параметра
  3. В src/TestBundle/Resources/config/services.yaml описать контейнер (код приведу ниже)
  4. Создать тестовый экшен
  5. Инжектировать созданный сервис внутрь экшена и получить значения переменных


Теперь по коду:
src/TestBundle/Resources/config/services.yaml
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  App\CurrencyConverterBundle\Service\TestService:
    arguments:
      $a: 'aaa'
      $b: 'bbb'


src/TestBundle/Service/TestService
class TestService
{
    public function __construct(
        private string $a,
        private string $b,
    ) {
    }

    public function getParams(): array
    {
        return [
            'a' => $this->a,
            'b' => $this->b,
        ];
    }
}


src/TestBundle/Action/TestAction
class AddAction extends AbstractController
{
    public function __construct(
        private CurrencyApiService $currencyApiService
    ) {
    }

    public function __invoke(Request $request): Response
    {
        dd($this->currencyApiService->getParams());
    }
}


src/TestBundle/DependencyInjection/TestExtension
class TestExtension extends Extension
{
    /**
     * @throws Exception
     */
    public function load(array $configs, ContainerBuilder $container): void
    {
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yaml');
    }
}


С таким кодом вываливается критическая ошибка
670e8f10a7360685293766.jpeg

В целом причину возникновения ошибки понимаю - симфони не понимает откуда брать эти переменные (хотя вроде бы в конфиге их привязал). Если бы "размазал" функционал по всему приложения можно было бы в config/services.yaml через bind прописать.

А тут ни в какую((( Пробовал ещё другие варианты описания конфига, в целом уже от безысходности, но также безрезультатно.
services:
  App\CurrencyConverterBundle\Service\TestService:
    arguments:
      - 'aaa'
      - 'bbb'

services:
  App\CurrencyConverterBundle\Service\TestService:
    arguments:
      'aaa'
      'bbb'


Будьте добры объясните, как пофиксить эту ошибку. Попытки погуглить - безрезультатны. Разве что часто встречал, рекомендацию внутри приложения не создавать бандлы...нууу очень надо :)

Буду признателен за помощь и любой совет!
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Пока похоже на то, что приложение пытается зарегистрировать все сервисы, которые находятся в папке src и у него это не получается из-за недостающих параметров. При этом бандл регистрируется и подключает свои сервисы на предыдущем шаге, т.е. приложение пытается перезаписать эти сервисы неверными дефинишенами

Попробуйте добавить в исключение директорию с бандлом
#config/services.yaml
services:
    App\:
        resource: '../src/'
        exclude:
            - '../src/TestBundle/'
            - '../src/CurrencyConverterBundle/'
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы