首页 > 解决方案 > 对类的每次修改都会导致错误“无法声明类,因为该名称已在使用中”

问题描述

我已经为 API 启动了一个 Symfony 项目并创建了我的第一个控制器

# services.yaml
parameters:

services:
    _defaults:
        autowire: true
        autoconfigure: true
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'
            - '../src/Tests/'
    App\Controller\:
        resource: '../src/EndPoints/*'
        tags: ['controller.service_arguments']

控制器:

namespace App\Controller;
class RegisterController extends AbstractController {
    public function register(Request $request): Response {
         //stuff
    }
}

我第一次运行它并得到预期的结果。我对它进行了修改RegisterController,但它因错误而死

编译错误:无法声明类 App\Controller\RegisterController,因为名称已在使用中

如果我进入services.yaml并保存它(没有修改),我可以使用更新的代码再次运行它。

当我添加并进行测试时,这才刚刚开始发生,doctrine-test-bundle但我不认为这两件事是相关的。我已经检查了我.env.local APP_ENV的开发者。是什么导致缓存意味着我必须重新保存services.yaml才能使任何更改生效?

标签: phpsymfonysymfony5

解决方案


您正在导入控制器两次。

在这里,您正在导入所有类,但您的控制器并未从自动装配中排除:

    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'
            - '../src/Tests/'

在这里你再次导入你的控制器类

    App\Controller\:
        resource: '../src/EndPoints/*'
        tags: ['controller.service_arguments']

当容器被编译时,你最终会得到这些类的双重定义。

做就是了:

services:
    _defaults:
        autowire: true
        autoconfigure: true
    App\:
        resource: '../src/'
        exclude:
            - '../src/DependencyInjection/'
            - '../src/Entity/'
            - '../src/Kernel.php'
            - '../src/Tests/'
            - '../src/EndPoints/'
    App\Controller\:
        resource: '../src/EndPoints/*'
        tags: ['controller.service_arguments']

你会被设置的。

此外,您有一个 PSR-4 不匹配,其中的类src/Endpoints属于 namespace Controller。这本身没有问题,但只有在composer.json正确设置的情况下才会起作用。最好有与命名空间匹配的目录,不要让它变得比应该的更难。


推荐阅读