PSR-4(和也是PSR-0)要求类ClassName
存储在名为ClassName.php
的文件中。名称区分大小写,并且必须完全匹配。
项目中的文件名是小写,类名是混合大小写。 Windows和MacOS上的默认磁盘格式在搜索时不区分大小写。这意味着当程序搜索Employee.php
并且文件employee.php
存在于目录中时,搜索成功并且OS返回现有文件,即使其名称与所需文件的情况不同。在基于Linux的操作系统上,默认磁盘格式区分大小写,并且搜索Employee.php
的程序找不到employee.php
。
你composer.json
文件声明app/
目录下面的PSR-4
标准MyDomain
命名空间的根目录下。这足以让自动装带器在需要加载类MyDomain\Models\Employee
时找到文件app/Models/Employee.php
。
因为你在Ubuntu(这是一个基于Linux的操作系统)运行它,PHP无法加载Employee.php
文件(因为它不存在)和OS并没有提供它的文件,而不是employee.php
。
看来您是使用composer update -o
或composer dump-autoload -o
生成自动装载机。 -o
(短缺--classmap-authoritative
)告诉Composer扫描您的案例中composer.json
(app/
)中声明的目录,并创建一个包含它可找到的所有类的类映射。类图是一个列表,它将类名(包含名称空间)映射到文件名(包含目录)。这样,自动装载机就可以准确知道每个类的位置,并且装载速度更快。
以上两段说明了添加新类后需要重新生成自动装载器的原因。
完成这项工作的正确方法是遵循PSR-4
的要求。更具体地说,MyDomain
下的每个名称空间必须存储在名称相同的子目录app/
中,其中包括案例。每个类必须存储在正确的子目录中,名称与该类相同(包括案例)和终止.php
(小写)的文件中。例如,类MyDomain\Models\Employee
必须保留在文件app/Models/Employee.php
中。
修复文件名后,您可以运行composer dump-autoload
并忘记它。只要类别和文件名称遵循PSR-4,自动装载机就会找到它们而不再次重新生成。
在生产服务器上,您可以运行composer dump-autoload -o
以稍微提高速度。不要忘记在每次部署之后再次运行它(或者,甚至更好的是,在部署脚本中包含该命令)。
什么操作系统? – axiac
我使用的是Ubuntu 16.04 –
它运行'composer dump-autoload'后会发现并加载类?奇怪...它不应该找到它们。你是否偶然运行'composer dump-autoload -o'? – axiac