为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
当年话下 2021-08-21 10:09:03
我有一个旧版应用程序,我正在使用 Symfony。到目前为止一切正常。现在我想为我的旧控制器使用自动装配。它们是使用作曲家classmap功能加载的位于根命名空间(例如\Controller_Page)类名与文件名不同是的。我知道这很糟糕。但它是遗留问题,我现在不想触及每个控制器(该应用程序中存在更大的问题)。我想使用依赖注入和自动装配来减少(可怕的)混乱。以下是我已经尝试过的一些方法:
查看完整描述

2 回答

?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

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”。


我不知道如何做到这一点。🙏感谢您的帮助。


查看完整回答
反对 回复 2021-08-21
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

好的,我在原始问题中添加了导致此结果的步骤。对我来说,这个解决方案有效。这可能不是最好的,但确实有效。(尽管开放以获得更好的建议)。


在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');


    // ...

}


查看完整回答
反对 回复 2021-08-21
  • 2 回答
  • 0 关注
  • 120 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信