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

Здравствуйте! <br/><br/> Я давно не работал с Symfony и сейчас чувствую себя немного растерянным в этом вопросе. В качестве теста я хотел бы попытаться реализовать следующее: <br/><br/> Сейчас перейду к коду: <br/> 

- **Файл:** src/TestBundle/Resources/config/services.yaml
```yaml
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  App\CurrencyConverterBundle\Service\TestService:
    arguments:
      $a: 'aaa'
      $b: 'bbb'
```
<br/> 

- **Файл:** src/TestBundle/Service/TestService
```php
class TestService
{
    public function __construct(
        private string $a,
        private string $b,
    ) {
    }

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

- **Файл:** src/TestBundle/Action/TestAction
```php
class AddAction extends AbstractController
{
    public function __construct(
        private CurrencyApiService $currencyApiService
    ) {
    }

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

- **Файл:** src/TestBundle/DependencyInjection/TestExtension
```php
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');
    }
}
```
<br/> 

С таким кодом возникает критическая ошибка.
  • 15 октября 2024 г. 16:03
Ответы на вопрос 2
В вашем коде есть несколько моментов, на которые нужно обратить внимание, чтобы корректно настроить сервисы в Symfony и избежать критической ошибки. Давайте разберемся с каждым из них:

1. **Не совпадение имен:** В вашем `services.yaml` файл, вы определяете `TestService`, но при этом используете `CurrencyApiService` в `AddAction`. Убедитесь, что вы корректно внедряете нужный сервис.

2. **Неизвестный сервис:** Если вы пытаетесь использовать `CurrencyApiService`, вам нужно убедиться, что он также правильно определён в `services.yaml`.

3. **Неизвестный класс:** Возможно, вы забыли соответствующий `use` для `CurrencyApiService` в `AddAction`.

4. **Проверка конфигурации:** Убедитесь, что структура каталогов и конфигурации вашего проекта правильная. Например, файл `services.yaml` должен находиться в нужном пространстве имен.

Вот исправленный вариант вашего кода:

**Файл:** `src/TestBundle/Resources/config/services.yaml`
```yaml
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

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

**Файл:** `src/TestBundle/Service/TestService.php`
```php
namespace App\TestBundle\Service;

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/AddAction.php`
```php
namespace App\TestBundle\Action;

use App\TestBundle\Service\TestService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

class AddAction extends AbstractController
{
    public function __construct(
        private TestService $testService // Измените на TestService
    ) {
    }

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

**Файл:** `src/TestBundle/DependencyInjection/TestExtension.php`
```php
namespace App\TestBundle\DependencyInjection;

use Symfony\Component\Container\Builder\ContainerBuilder;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;

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');
    }
}
```

### Обратите внимание:
- Проверьте, что пространство имен ваших классов указано правильно.
- Внедряйте корректный сервис в `AddAction` (в данном случае это `TestService`, а не `CurrencyApiService`, если он не определён).
- После внесения этих изменений вы сможете избежать критической ошибки.

Не стесняйтесь задавать дополнительные вопросы, если что-то неясно!
Пока похоже на то, что приложение пытается зарегистрировать все сервисы, которые находятся в папке src и у него это не получается из-за недостающих параметров. При этом бандл регистрируется и подключает свои сервисы на предыдущем шаге, т.е. приложение пытается перезаписать эти сервисы неверными дефинишенами 

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