Php 不带PSR-4的传统控制器的Symfony自动布线

Php 不带PSR-4的传统控制器的Symfony自动布线,php,symfony,dependency-injection,symfony4,symfony-dependency-injection,Php,Symfony,Dependency Injection,Symfony4,Symfony Dependency Injection,我有一个遗留应用程序,我正在使用Symfony。 到目前为止一切正常 现在我想为我的传统控制器使用自动布线 它们是使用composersclassmap功能加载的 位于根命名空间中(例如,\Controller\u页面) 类名与文件名不同 嗯。我知道这很糟糕。但这是一个遗留问题,目前我不想触及每一个控制器(该应用程序存在更大的问题) 我想使用依赖注入和自动连接来减少(可怕的)混乱 以下是我已经尝试过的一些方法: services: _defaults: autowire:

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

现在我想为我的传统控制器使用自动布线

  • 它们是使用composers
    classmap
    功能加载的
  • 位于根命名空间中(例如,
    \Controller\u页面
  • 类名与文件名不同
嗯。我知道这很糟糕。但这是一个遗留问题,目前我不想触及每一个控制器(该应用程序存在更大的问题)

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

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

services:
 _defaults:
        autowire: true
        autoconfigure: true
    "\\":
        resource: '../legacy/Controller'
        tags: ['controller.service_arguments']
命名空间不是有效的PSR-4前缀

命名空间前缀必须以“\”结尾

(我的
\BaseController
只有
Symfony\Component\HttpFoundation\RequestStack
作为
\uu构造
-参数)

控制器“BaseController”具有必需的构造函数参数,并且在容器中不存在。您忘记定义这样的服务了吗

无法加载资源“4208ad7faaf7d383f981bd32e92c4f2f”

我不知道如何做到这一点。
好的,我在原始问题中添加了导致这个结果的步骤。 对我来说,这个解决方案有效。 这也许不是最好的,但确实有效。 (不过,还是可以提出更好的建议)

Kernel.php
中,我滥用composer Autoloader来获取我需要的类并将它们注册为服务。由于未使用的服务将被删除,我没有问题:-)


Autowire在命名约定、类名和名称空间方面有一些非常严格的要求。您是否尝试过仅手动配置一个控制器?是的,手动配置控制器有效。我只是希望有自动布线(甚至更重要的自动配置)到位。有没有办法绕过那些“严格要求”?据我所知没有。autowire代码正是magic的定义。它工作得很好,但我怀疑除了作者之外是否有人真正理解它。似乎只是配置上的一个限制:-)我更进一步了,但仍然不在那里。我编辑了原始问题。
services:
 _defaults:
        autowire: true
        autoconfigure: true
    "":
        resource: '../legacy/Controller'
        tags: ['controller.service_arguments']
// in Kernel::configureContainer()
$container->registerForAutoconfiguration(\BaseController::class);
// in Kernel::configureContainer()
$container->registerForAutoconfiguration(\Controller_Legacy::class);
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');

    // ...
}