У меня есть старое приложение, и я использую Symfony с ним.Пока все работает отлично.
Теперь я хочу использовать Autowiring для своих Legacy-контроллеров.
- они загружены с использованием композиторов
classmap
функциональность - в пространстве корневых имен (например,
\Controller_Page
) - имена классов отличаются от имен файлов
Да.Я знаю, что это дерьмо.Но это наследие, и я не хочу касаться каждого контроллера в данный момент (большие проблемы в этом приложении).
Я хотел бы использовать Dependency-Injection и Autowiring, чтобы уменьшить (ужасный) беспорядок.
Вот несколько подходов, которые я уже попробовал:
services:
_defaults:
autowire: true
autoconfigure: true
"\\":
resource: '../legacy/Controller'
tags: ['controller.service_arguments']
Пространство имен не является допустимым префиксом PSR-4
services:
_defaults:
autowire: true
autoconfigure: true
"":
resource: '../legacy/Controller'
tags: ['controller.service_arguments']
Префикс пространства имен должен заканчиваться символом "\"
// in Kernel::configureContainer()
$container->registerForAutoconfiguration(\BaseController::class);
(мой \BaseController
имеет только Symfony\Component\HttpFoundation\RequestStack
как __construct
-аргумент)
Controller "BaseController"имеет обязательные аргументы конструктора и не существует в контейнере.Вы забыли определить такой сервис?
// in Kernel::configureContainer()
$container->registerForAutoconfiguration(\Controller_Legacy::class);
Невозможно загрузить ресурс "4208ad7faaf7d383f981bd32e92c4f2f".
Понятия не имею, как этого добиться.? Спасибо за вашу помощь.
Изменить 1
Получил еще один шаг вперед.Я выполнил автоконфигурацию для одного из этих унаследованных контроллеров, например:
// Kernel.php
protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
{
$container->addDefinitions([
\Controller_Legacy::class => (new Definition(\Controller_Legacy::class))
->setAutowired(true)
->setAutoconfigured(true)
->addTag('controller.service_arguments'),
]);
// ...
}
Так что, похоже, мои предыдущие проблемы были вызваны конфигурацией yaml или чем-то, а не самим контейнером.
СейчасЯ должен найти способ зарегистрировать все мои Legacy-контроллеры.Поиграюсь немного и обновлю, если найду хорошее решение.(Хорошие решения приветствуются)
Edit2
Хорошо, это не была YAML-конфигурация.Если я использую PHP-конфигурацию, я получаю ту же проблему.
/** @var $this \Symfony\Component\DependencyInjection\Loader\PhpFileLoader */
$definition = new Definition();
$definition
->setAutowired(true)
->setAutoconfigured(true)
->setPublic(false)
;
$this->registerClasses($definition, '\\', '../legacy/*');
Пространство имен не является действительным префиксом PSR-4.
Я попытаюсь зарегистрироватьклассы теперь вручную.