2017-01-21 49 views
2

我需要在每次添加新類時轉儲自動加載器。我正在使用psr-4。我不知道爲什麼我需要這樣做。在psr-4中它應該自動加載類。我哪裏錯了?每當我添加一個新類時,需要將自動加載轉儲到每次添加新類時

這是我的composer.json文件

{"autoload": {"psr-4": {"MyDomain\\": "app"}}} 

這裏是我的目錄結構:

enter image description here

下面是我的一個類代碼:

<?php 

namespace MyDomain\Model; 

class Employee { 

} 
?> 
+0

什麼操作系統? – axiac

+0

我使用的是Ubuntu 16.04 –

+0

它運行'composer dump-autoload'後會發現並加載類?奇怪...它不應該找到它們。你是否偶然運行'composer dump-autoload -o'? – axiac

回答

3

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 -ocomposer dump-autoload -o生成自動裝載機。 -o(短缺--classmap-authoritative)告訴Composer掃描您的案例中composer.jsonapp/)中聲明的目錄,並創建一個包含它可找到的所有類的類映射。類圖是一個列表,它將類名(包含名稱空間)映射到文件名(包含目錄)。這樣,自動裝載機就可以準確知道每個類的位置,並且裝載速度更快。

以上兩段說明了添加新類後需要重新生成自動裝載器的原因。

完成這項工作的正確方法是遵循PSR-4的要求。更具體地說,MyDomain下的每個名稱空間必須存儲在名稱相同的子目錄app/中,其中包括案例。每個類必須存儲在正確的子目錄中,名稱與該類相同(包括案例)和終止.php(小寫)的文件中。例如,類MyDomain\Models\Employee必須保留在文件app/Models/Employee.php中。

修復文件名後,您可以運行composer dump-autoload並忘記它。只要類別和文件名稱遵循PSR-4,自動裝載機就會找到它們而不再次重新生成。

在生產服務器上,您可以運行composer dump-autoload -o以稍微提高速度。不要忘記在每次部署之後再次運行它(或者,甚至更好的是,在部署腳本中包含該命令)。

+0

它的工作,並感謝你一個非常明確和準確的答案。 –

相關問題