我有一个 symfony 5 项目。
我遇到了自动加载的问题。
我使用框架提供的默认自动加载配置。
我在同一命名空间下的同一目录中定义了类、抽象类和接口(interface)。
问题是,当我这样描述我的类(class)时:
类 MyClass 扩展 MyAbstractClass
类 MyAbstractClass 实现 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" ...
如果我使用:
类 MyClass 扩展 MyAbstractClass
或
类 MyClass 实现 MyClassInterface
或
类 MyClass 扩展 MyAbstractClass 实现 MyClassInterface
然后错误消失了 - 一切正常。
只有在我使用的时候才会出现这个错误
类 MyAbstractClass 实现 MyClassInterface
如何解决问题?
我需要让抽象类实现一个接口(interface),这样任何扩展 AbstractClass 的类都将与该接口(interface)兼容。
PHP 7.4.1(客户端)
最佳答案
问题是顺序,正在加载文件。
我发现了问题,但我还没有解决它。
问题是自动加载器按字母顺序包含文件,但不是按顺序,必须包含文件。
我实际的类名是:
抽象实体
实体接口(interface)
门票
实现是:
接口(interface) EntityInterface {}
抽象类 AbstractEntity 实现 EntityInterface {}
class Ticket extends AbstractEntity {}
文件包含在下一个顺序中(按字母顺序):
AbstractEntity.php
EntityInterface.php
Ticket.php
AbstractEntity.php
- 此文件声明了 AbstractEntity
类。
这个类实现了EntityInterface
接口(interface),所以EntityInterface.php
文件必须已经包含在AbstractEntity.php
之前。
正确的顺序必须是:
EntityInterface.php
AbstractEntity.php
Ticket.php
很容易检查,只需将 AbstractEntity
重命名为 ObstractEntity
,那么字母顺序将是:
EntityInterface.php
ObstractEntity.php
Ticket.php
现在只剩下修复自动加载顺序了。但是……应该怎么快速修复呢?有任何想法吗?是供应商自动加载问题还是 Symfony?
据我所知,composer.json
中有某种选项,其中指出:
"autoload": {
"psr-4": {
"App\\": "src/"
}
},
"autoload-dev": {
"psr-4": {
"App\\Tests\\": "tests/"
}
},
更新:
好的,我创建了一个新项目 - 一切正常。
它适用于 Entity
目录和 Entities
。版本都一样。
但是一旦我在我的源项目中将 Entites
重命名为 Entity
- 一切都开始正常工作。
所以这是一件奇怪的事情。
我只能认为 Symfony 不是那么灵活,类应该存储在 Entity
目录中,这样 autolaod 才能正常工作。
现在是
Ticket.php
AbstractEntity.php
EntityInterface.php
以他们彼此需要的方式。
关于php+symfony 5.0.x 扩展抽象类和同时实现接口(interface)时自动加载问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59878138/