Как я могу динамически пакетно настроить службы в Symfony 3.4?
Сегодня я могу вручную настроить свои репозитории Doctrine как службы в services.yml
, например:
AppBundle\Repository\MyEntityRepository:
class: Doctrine\ORM\EntityRepository
factory: ['@doctrine.orm.default_entity_manager', getRepository]
arguments:
- AppBundle\Entity\MyEntity
Проблема этого подхода заключается в том, что он слишком многословен и, на мой взгляд, слишком подвержен ошибкам, регистрируя по отдельности каждый из моих репозиториев (их много!).Мне также нужно синхронизировать их с моим services_test.yml
, что еще больше усугубляет проблему.
До этого я работал с какой-то другой библиотекой внедрения зависимостей, PHP-DI, с помощью которой я могу выполнить то, что хочу.использование подстановочных знаков и функции фабрики обратного вызова:
$dependencyInjectionContainerBuilder->addDefinitions([
'AppBundle\Repository\*' => function (
\DI\Factory\RequestedEntry $requestedEntry,
\Doctrine\ORM\EntityManager $em
) {
$className = $requestedEntry->getName();
$matches = [];
preg_match('~AppBundle\\\\Repository\\\\(.*)Repository~', $className, $matches);
if (!empty($matches[1])) {
return $em->getRepository('AppBundle\\Entity\\' . $matches[1]);
}
}
]);
Этот фрагмент кода в основном отслеживает автопроводку для классов AppBundle \ Repository *, а когда находит, вызывает $ em-> getRepository с правильным именем класса и возвращаетэтот объект.
Я знаю, что код выглядит неуклюже, но в моем случае этот код легче поддерживать, чем не отставать от десятков регистраций служб вручную.
Кто-нибудь знает, каксделать это в Symfony 3.4?