Symfony Autowiring 用于没有 PSR-4 的传统控制器

我有一个旧版应用程序,我正在使用 Symfony。到目前为止一切正常。

现在我想为我的旧控制器使用自动装配。

  • 它们是使用作曲家classmap功能加载的

  • 位于根命名空间(例如\Controller_Page

  • 类名与文件名不同

是的。我知道这很糟糕。但它是遗留问题,我现在不想触及每个控制器(该应用程序中存在更大的问题)。

我想使用依赖注入和自动装配来减少(可怕的)混乱。

以下是我已经尝试过的一些方法:


当年话下
浏览 121回答 2
2回答

侃侃尔雅

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-argument)控制器“BaseController”具有必需的构造函数参数,并且在容器中不存在。您是否忘记定义这样的服务?// in Kernel::configureContainer()$container->registerForAutoconfiguration(\Controller_Legacy::class);无法加载资源“4208ad7faaf7d383f981bd32e92c4f2f”。我不知道如何做到这一点。🙏感谢您的帮助。

饮歌长啸

好的,我在原始问题中添加了导致此结果的步骤。对我来说,这个解决方案有效。这可能不是最好的,但确实有效。(尽管开放以获得更好的建议)。在Kernel.php我滥用作曲家自动加载器来获取我需要的类并将它们注册为服务。由于未使用的服务将被删除,我没有问题:-)protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void{    /** @var ClassLoader $classLoader */    $classLoader = require $this->getProjectDir().'/vendor/autoload.php';    foreach (array_keys($classLoader->getClassMap()) as $class) {        $definition = (new Definition($class))            ->setAutowired(true)            ->setAutoconfigured(true)            ->setPublic(false);        $container->setDefinition($class, $definition);    }    // Since my ClassMap contains not only controllers, I add the 'controller.service_arguments'-Tag    // after the loop.    $container        ->registerForAutoconfiguration(\BaseController::class)        ->addTag('controller.service_arguments');    // ...}
打开App,查看更多内容
随时随地看视频慕课网APP