我目前正在运行Slim和Twig,我的文件夹结构如下
/application/modules
在我的composer.json中,我有
"autoload": {
"psr-4": {
"Application\\": "application/modules/",
"Core\\": "application/",
"Middleware\\": "application/slim/middleware/"
}
}
我的问题是在Application\modules\
我有一个每个模块的目录。现在我的问题是,在使用PSR-4自动加载时,是否有可能让作曲家遍历子目录?
答案 0 :(得分:3)
我发现您的PSR-4声明存在问题。
您不应将“Core”类放在包含其他命名空间子文件夹的文件夹中。
Composer中的PSR-4自动加载的工作方式如下:如果要加载的类的完全限定类名与任何PSR-4定义中声明的前缀匹配,则前缀中提到的前缀将从类名中删除,并将剩余的类名映射到文件名并进行搜索。
如果文件夹Application\
中有名为application/modules
的类,并且文件夹Core\
中有名为application
的类,那么技术上Composer可能会找到与类名称如Core\modules\Whatever
,但这些文件将包含类Application\Whatever
。
我建议将所有Core
类移到自己的文件夹中,并在PSR-4声明中指出这一点。
原始问题的问题在于您省略了一个重要信息:模块的类和文件结构是什么?
Composer的自动加载器将很乐意解析以名称空间前缀Application
开头的任何类,从类名中删除该前缀,将余数转换为路径名并在application/modules/
中搜索该文件。假设您有一个模块类Application\MyModule\Foobar
,它将在application/modules/MyModule/Foobar.php
中搜索。为什么?因为将删除前缀Application
以允许PSR-4中的较短路径名称。 (使用PSR-0意味着你必须在类名中为每个级别的命名空间都有一个文件夹。)
请注意,建议最佳性能尽可能长地为命名空间创建前缀,因为Composer允许为任何给定前缀创建多个目录,但必须在多个目录中搜索正确的文件。搜索文件非常耗时!