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