[英]PSR-0 autoloader issue
我在PSR-0
自動加載的項目中無法通過路徑實例化類。 結構如下:
| - src/
| - Models/
| - My_New_Model_Migration.php
| - ...
| SeederCommand.php
| - vendor/
| - ...
| composer.json
和Composer自動加載器:
"autoload": {
"psr-0": {
"" : [
"src/"
]
}
}
在SeederCommand
類中SeederCommand
太多SeederCommand
,它基本上是Doctrine / migrations類,應該使用up()
和down()
方法創建遷移。
在負責生成這些函數的函數內部,我有以下部分:
if (file_exists(__DIR__ . "/Models/{$model}_Migration.php")) {
$class = "{$model}_Migration";
$instantiated = new $class;
....
}
在回顯時,我注意到該文件確實存在,因此該部分正在正常工作。 但是,在更新課程時,出現錯誤:
PHP致命錯誤:未捕獲錯誤:在/var/www/html/.../src/SeederCommand.php:97中找不到類'/var/www/html/.../src/Models/My_New_Model_Migration.php'
由於路徑是正確的,因此我認為問題一定是PSR-0
自動加載器通過下划線來解析路徑嗎?
周圍有辦法嗎?
編輯:
這個答案對我沒有幫助,因為它解釋了自動裝帶器故事的“原因”。 我知道PSR-0
和PSR-4
自動裝帶器都是如何在高水平上工作的。 我想解決一個事實,即自動加載器需要一個沒有目錄結構的目錄結構(在這種情況下,我不想引入它)。
編輯2:
SeederCommand
類需要自動加載文件:
require "../vendor/autoload.php";
我嘗試過執行一次dump-autoload
並將類重命名為一個沒有下划線的類,並且發生了同樣的事情,因此我可能在自動加載本身方面做錯了。
編輯3:
我嘗試更新我重命名為非下划線版本的類。 例如,更新MyNewClass
可以,但是My_New_Class
會引發錯誤。
$class = __DIR__ . "/Models/{$model}_Migration.php";
$instantiated = new $class;
這是錯誤的,因為您不能通過類的文件名來創建類的實例:
$instance = new /var/www/html/.../Class.php; // <-- wrong
相反,您需要使用類名和名稱空間:
$instance = new \Project\Namespace\Class;
因此,在您的特定情況下,它可能類似於
$class = "\\Project\\Models\\".$model."_Migration";
// ^ depends on the real namespace and name of your migration classes
$instantiated = new $class;
再次閱讀PSR-0標准之后,老實說,我認為使用PSR-0時無法實現您想要的(具有帶下划線的類名,但沒有目錄)。 該標准明確規定:
類別名稱中的每個_字符都將轉換為DIRECTORY_SEPARATOR。
但是您可以改用composer的classmap自動加載器來處理這些文件:
通過掃描給定目錄/文件中所有.php和.inc文件中的類來構建此映射。 您可以使用類映射生成支持為所有不遵循PSR-0 / 4的庫定義自動加載。 要配置它,您可以指定所有目錄或文件來搜索類。
它可能看起來像這樣(但我無法對其進行測試):
"autoload": {
"psr-0": {
"" : [
"src/"
]
},
"classmap": ["src/Models/"]
}
您的類名中不能包含下划線,目錄結構中也不能包含下划線。
如果您的類名為Models_MyWhatever_Migration
,因為在遷移過程中將字符串“ MyWhatever”動態添加到了類名,則該類必須放置在src/Models/MyWhatever/Migration.php
。 您不能在src/Models/MyWhatever_Migration.php
擁有它。
如果要將下划線保留為文件名的一部分,則必須切換到PSR-4並使用名稱空間。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.