Я хотел бы иметь возможность создавать сервисы по их именам классов. Один из способов сделать это: установить свойство "public" в "services.yaml" НО Я НЕ ХОЧУ устанавливать "общедоступное" свойство для ВСЕХ классов в моем проекте.
services.yaml
services:
_defaults:
public: false # it helps to optimize performance, doesn't it?
App\Service\Service1
public: true
App\Service\Service2
public: true
App\Service\Service3
public: true
App\Service\* # why I can't use something like "*" here ???
public: true
Service1.php
namespace App\Service;
class Service1
{
// important: every service can have one or more dependencies (Foo, Bar, Baz ... etc)
public function __construct(Foo $foo, Bar $bar)
{
$this->foo = $foo;
//..........
}
}
MyController.php
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
// hier $className is any class name like "App/Service/xxxx"
public function myAction (string $className)
{
return $this->container->get($className);
}
Вопросов:
Спасибо






Зачем вам нужно делать публичные сервисы? Это идет вразрез с лучшими практиками Symfony, которые препятствуют прямому извлечению сервисов из контейнера.
Если вы хотите определить службы, названные по имени их класса, достаточно указать на них:
services:
App\Service\Service1: ~
App\Service\Service2: ~
App\Service\Service3: ~
App\Service\Service4:
arguments:
- '@App\Service\Service1'
- '@App\Service\Service2'
- '@App\Service\Service3'
а затем вводите их напрямую в контроллеры, вместо использования контейнера.
Моя проблема: я не хочу менять services.yaml каждый раз, когда добавляю новую службу
@AlexLysenko Вы можете использовать автоматическое подключение для своих сервисов, чтобы не определять свои сервисы вручную: symfony.com/doc/current/service_container/autowiring.html
Возможно, вы сможете использовать функции импорта YAML, чтобы обобщить нужную вам конфигурацию и упростить ее обслуживание.
Например:
# /config/services.yaml
imports:
- { resource: 'services/public/*.yaml' } # Import public services
- { resource: 'services/private/*.yaml' } # Import private services
Хотя, как уже упоминалось, принуждение контейнерных сервисов к публичному использованию идет вразрез с соглашениями Symfony и не будет поддерживаться в будущих версиях. Используйте внедрение зависимостей вместо прямого взаимодействия с сервисным контейнером.
Спасибо, Эди. Не могли бы вы написать, почему я могу «закачивать их в свои контроллеры напрямую»?