对 class 的每次修改都会导致错误 'Cannot declare class because the name is already in use'

Every modification to class causes error 'Cannot declare class because the name is already in use'

我已经为 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 进行了修改,但它因错误

而死

Compile Error: Cannot declare class App\Controller\RegisterController, because the name is already in use

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

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

从你的services.yaml看来你需要更换控制器部分。

来自

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

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

但是如果您想将控制器放入 EndPoints 文件夹中,您还需要更改配置中的别名。

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

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

别忘了更改路由配置

您正在导入控制器两次。

在这里,您正在导入所有 类,但您的控制器 被排除在 auto-wiring 之外:

    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 处的 类 属于命名空间 Controller。这没有问题 per-se,但只有当您的 composer.json 设置正确时它才会起作用。最好有与命名空间匹配的目录,不要让它变得比它应该的更难。

您只是忘记了 class 中您已创建并使用它的名称空间