簡體   English   中英

PSR-0自動裝帶器問題

[英]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-0PSR-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標准之后,老實說,我認為使用PSR-0時無法實現您想要的(具有帶下划線的類名,但沒有目錄)。 該標准明確規定:

類別名稱中的每個_字符都將轉換為DIRECTORY_SEPARATOR。

可能的解決方案:Classmap自動加載器

但是您可以改用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM