2013-10-24 140 views
3

的GitHub庫自動加載我PHP Fatal error: Class 'sendwithus\sendwithus_php\lib\API' not found與作曲家問題

composer.json:

{ 
    "repositories": { 
     "sendwithus_php": { 
      "type": "package", 
      "package": { 
       "name": "sendwithus/sendwithus_php", 
       "version": "1.0.3", 
       "source": { 
        "url": "https://github.com/sendwithus/sendwithus_php", 
        "type": "git", 
        "reference": "0dfed56" 
       } 
      } 
     } 
    }, 
    "require": { 
     "sendwithus/sendwithus_php": ">=1.0.3" 
    }, "autoload": { 
     "psr-0": { 
      "Foo\\": "src/", 
      "sendwithus\\": "vendor/sendwithus/sendwithus_php/lib" 
     } 
    }, "minimum-stability" : "dev" 
} 

test.php的:

use sendwithus\sendwithus_php\lib\API; 

require_once 'vendor/autoload.php'; 

$api = new API('KEY'); 

我在做什麼錯?

+0

的API類在命名空間'sendwithus'。你的自動加載的東西應該照顧找到文件;不要試圖將名稱空間位置放置在角落。 – cHao

+0

是的,但你能舉個例子嗎? –

+0

'使用sendwithus \ API;' – cHao

回答

6

有東西在你的情況下,會錯了一堆。我會盡力糾正它。

首先我看看你所需要的圖書館。它在Github上公開,它有一個composer.json文件有錯誤。

{ 
    "name": "sendwithus/api", 
    "version": "1.0.3", 
    "require": {}, 
    "repositories": [ 
     { 
      "type": "vcs", 
      "url": "https://github.com/sendwithus/sendwithus_php" 
     } 
    ] 
} 

這些信息有些不對。只有名稱格式正確。

  • 不應該有一個版本。通過在git中標記代碼來檢測版本。
  • 如果不需要,該鍵可以省略。
  • 當前存儲庫URL不應包含在它自己的存儲庫中。
  • 提到許可證會很好 - 目前每個使用這個庫的人都應該害怕侵犯版權。
  • 重要但缺失的信息:如何配置自動加載?

調查該資料庫的內容很快發現,它不符合PSR-0,所以唯一可行的是可選擇性自動加載類映射 - 因爲只有兩個在lib夾中的文件是足以。

正確的自動加載的定義是:如何構建這個

"autoload": { 
     "classmap": ["lib"] 
    } 

詳細信息可在http://getcomposer.org/doc/04-schema.md#classmap實際上,對於類映射鍵的值相對於應該建立索引庫根目錄的目錄列表。

測試文件夾不需要在這裏提及。使用PHPUnit,該文件夾將被掃描以查找包含測試類的任何文件。測試引導程序應包含由Composer生成的vendor/autoload.php文件。

我不知道OP是否負責此存儲庫或可以更改它。上面的信息應該在存儲庫本身中實現,但如果不能,它也會有幫助,因爲它也可以進入「包」定義。

所以現在我們要看看OP的提到composer.json

{ 
    "repositories": { 
     "sendwithus_php": { 
      "type": "package", 
      "package": { 
       "name": "sendwithus/sendwithus_php", 
       "version": "1.0.3", 
       "source": { 
        "url": "https://github.com/sendwithus/sendwithus_php", 
        "type": "git", 
        "reference": "0dfed56" 
       } 
      } 
     } 
    }, 
    "require": { 
     "sendwithus/sendwithus_php": ">=1.0.3" 
    }, "autoload": { 
     "psr-0": { 
      "Foo\\": "src/", 
      "sendwithus\\": "vendor/sendwithus/sendwithus_php/lib" 
     } 
    }, 
    "minimum-stability" : "dev" 
} 

的「倉庫」鍵可以包含的類型爲「包」包含一個項目的所有必要的信息對象沒有這樣做,或者沒有做到正確。正如我提到的,自動加載在原始定義斷裂,所以它必須固定在這裏:

 "sendwithus_php": { 
      "type": "package", 
      "package": { 
       "name": "sendwithus/api", 
       "version": "1.0.3", 
       "source": { 
        "url": "https://github.com/sendwithus/sendwithus_php", 
        "type": "git", 
        "reference": "0dfed56" 
       }, 
       "autoload": { 
        "classmap": ["lib"] 
       } 
      } 
     } 

這將正確地引用庫,並啓用自動加載。請注意,名稱已在此處更改爲原始名稱 - 如果此庫在兩個不同的名稱下(一個在此定義,另一個在原始存儲庫中)知道,但使用相同的名稱空間和類名稱,可能會觸發故障。

既然存儲庫信息是固定的,那麼其他所有的東西在composer.json中都可以正常工作。

"require": { 
    "sendwithus/api": "1.0.3" 
}, 
"autoload": { 
    "psr-0": { 
     "Foo\\": "src/" 
    } 
}, 
"minimum-stability" : "dev" 

請注意,此處定義的自動加載僅適用於此庫或應用程序。不要在這裏包含依賴關係的自動加載!

然後,我們照顧你的代碼:

use sendwithus\sendwithus_php\lib\API; 

require_once 'vendor/autoload.php'; 

$api = new API('KEY'); 

的命名空間是錯誤的。不要使用Composer中的名稱。使用您正在導入的代碼中的名稱。這是正確的:

require_once __DIR__ . "../vendor/autoload.php"; 

use sendwithus\API; 

$api = new API("apikey"); 

請注意,你不能在作曲重命名更改庫的命名空間。 Composer只會爲您下載PHP源文件,它不會更改文件內的代碼。

我最後composer.json文件是這樣的:

{ 
    "repositories": { 
     "sendwithus_php": { 
      "type": "package", 
      "package": { 
       "name": "sendwithus/api", 
       "version": "1.0.3", 
       "source": { 
        "url": "https://github.com/sendwithus/sendwithus_php", 
        "type": "git", 
        "reference": "0dfed56" 
       }, 
       "autoload": { 
        "classmap": ["lib"] 
       } 
      } 
     } 
    }, 
    "require": { 
     "sendwithus/api": "1.0.3", 
    }, 
    "autoload": { 
     "psr-0": { 
      "Foo\\": "src/" 
     } 
    }, 
    "minimum-stability": "dev" 
} 
+0

我昨天剛剛做了同樣的事情!哈哈;-) –

+0

你說「測試引導應該包括由Composer生成的vendor/autoload.php文件」。你的意思是在lib本身中應該有vendor/autoload.php嗎? –

+0

你現在在說哪個庫?測試需要訪問要測試的代碼,最簡單的方法是使用生產中使用的自動加載。 PHPUnit已經負責加載測試。因此,生產代碼的缺失鏈接是包含要測試代碼的'vendor/autoload.php'。 – Sven

1

如果你有一個標準的目錄結構(如vendor/sendwithus/sendwithus_php/lib),您將需要修改的路徑是相對於該封裝的composer.json

"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib" 

變爲:

"sendwithus\\": "lib/" 

取看看vendor/composer/autoload_namespaces.php哪個應該列出正在使用的路徑。注意作曲家將如何預先考慮$vendorDir給你,讓你的命名空間應該不需要引用它

一個例子,從我的項目:

'Core\\' => array($vendorDir . '/alex-patterson-webdev/core/src'), 
+0

「vendor/composer/autoload_namespaces.php」中的路徑更改爲「lib /」並轉儲自動載入後,有''sendwithus \\'=>數組($ baseDir。'/ lib')' –

+0

加載它時仍然存在問題。什麼是'使用'線? –