3

我有一个 symfony 5 项目。

我遇到了自动加载的问题。

我使用框架提供的默认自动加载配置。

我在同一个命名空间下的同一个目录中定义了类、抽象类和接口。

问题是,当我这样描述我的班级时:

class MyClass extends MyAbstractClass

class MyAbstractClass implements MyClassInterface

我收到自动加载错误:

Attempted to load class "MyClass" from namespace "App\Entities".  
Did you forget a "use" statement for another namespace? 

日志中的一行:

Error thrown while running command "myproject:mycommand". Message: "Class 'App\Entities\MyClass' not found" ...

如果我使用:

class MyClass extends MyAbstractClass

或者

class MyClass implements MyClassInterface

或者

class MyClass extends MyAbstractClass implements MyClassInterface

然后错误消失了 - 一切正常。

仅当我使用时才会出现错误

class MyAbstractClass implements MyClassInterface

如何解决问题?

我需要使该抽象类实现一个接口,因此任何将扩展 AbstractClass 的类都将与该接口兼容。

PHP 7.4.1 (cli)

4

1 回答 1

0

问题是顺序,正在加载文件。

我发现了问题,有点我还没有解决它。

问题是自动加载器按字母顺序包含文件,但不是按顺序,必须包含文件。

我的实际班级名称是:

AbstractEntity

EntityInterface

Ticket

实现是:

interface EntityInterface {}

abstract class AbstractEntity implements EntityInterface {}

class Ticket extends AbstractEntity {}

这些文件包含在下一个顺序(按字母顺序):

AbstractEntity.php

EntityInterface.php

Ticket.php

AbstractEntity.php- 这个文件声明了AbstractEntity类。

这个类实现EntityInterface了接口,所以EntityInterface.php文件必须已经包含在AbstractEntity.php.

正确的顺序必须是:

EntityInterface.php

AbstractEntity.php

Ticket.php

很容易检查,只需将 重命名AbstractEntityObstractEntity,那么字母顺序将是:

EntityInterface.php

ObstractEntity.php

Ticket.php

现在它只是修复自动加载顺序。但是......它应该如何快速修复?有任何想法吗?是供应商自动加载问题还是 Symfony?

AFAIK 有一些选项,composer.json其中状态:

    "autoload": {
        "psr-4": {
            "App\\": "src/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "App\\Tests\\": "tests/"
        }
    },

更新:好的,我创建了一个新项目 - 一切正常。它适用于Entity目录和Entities. 版本都一样。

但是一旦我在我的源项目中重命名EntitesEntity- 一切都开始工作而没有错误。

所以这是一件很奇怪的事情。

我只能认为 Symfony 不是那么灵活,类应该存储在Entity目录中,然后 autolaod 运行良好。

现在是

Ticket.php

AbstractEntity.php

EntityInterface.php

他们互相要求的方式。

于 2020-01-24T10:16:29.187 回答