2017-09-06 78 views
2

我想在我的wordpress項目中包含一個自動加載器。更具體地說,我正在開發一個包含我所有類的Classes /目錄的插件。我希望這些類可以通過命名空間訪問我的wordpress項目根目錄和子文件/文件夾。自動加載器導致類沒有找到

我覺得我的composer.json應該照顧自動加載器的實現,儘管我仍然得到一個類未找到致命錯誤。有其他人遇到這個問題嗎?我很欣賞任何建議!

這是我試過到目前爲止:

./composer.json

{ 
     "autoload": { 
      "psr-4": { 
       "Classes\\": "wp-content/plugins/example-plugin/Classes" 
      } 
     }, 
     "require": {} 
    } 

然後...

composer install

./index.php(在WordPress根)

require_once('./vendor/autoload.php'); 

$foo = new \Classes\MyService(); 

var_dump($foo); //Fatal error: Uncaught Error: Class 'Classes\MyService' not found 
die(); 

./wp-content/plugins/example-plugin/Classes/MyService.php

namespace Classes; 

class MyService { 
+0

PSR-4是否要求該文件爲'./wp-content/plugins/example-plugin/Classes/Api/MyService.php'(特別注意'Api'目錄)? – Phil

+0

嗨菲爾,我欣賞這些建議,我已經做了這兩個改動,現在仍然是運氣:/(看編輯) – AnchovyLegend

+0

你是否已經執行了'dump-autoload'作曲者任務,因爲你添加了'autoload'字段? – Phil

回答

2

是的,的確,作曲家應該把你的依賴和自動加載的照顧。你的配置也是正確的。讓我們通過一個檢查清單:

你的環境是這樣的嗎?

$ tree 
. 
├── composer.json 
├── composer.phar 
├── index.php 
├── vendor 
│   ├── autoload.php 
│   └── composer 
│    ├── autoload_classmap.php 
│    ├── autoload_namespaces.php 
│    ├── autoload_psr4.php 
│    ├── autoload_real.php 
│    ├── autoload_static.php 
│    ├── ClassLoader.php 
│    ├── installed.json 
│    └── LICENSE 
└── wp-content 
    └── plugins 
     └── example-plugin 
      └── Classes 
       └── MyService.php 

您的composer.json看起來像這樣嗎?

$ cat composer.json 
{ 
    "name": "my/project", 
    "authors": [ 
     { 
      "name": "My Name", 
      "email": "[email protected]" 
     } 
    ], 
    "autoload": { 
     "psr-4": { 
      "Classes\\": "wp-content/plugins/example-plugin/Classes" 
     } 
    }, 
    "require": {} 
} 

你的實現是這樣嗎?

$ cat wp-content/plugins/example-plugin/Classes/MyService.php 
<?php 
namespace Classes; 

class MyService { 
} 

最後,你的索引看起來是這樣嗎?

$ cat index.php 
<?php 

require_once('./vendor/autoload.php'); 

$foo = new \Classes\MyService; 

var_dump($foo); 

如果您對所有這些問題的答案是「是」,那麼您是否刷新了自動裝載機?

$ composer dump-autoload 

如果你的回答是「是」,然後創建一個新的目錄,下載composer.phar,運行php composer.phar init,這個答案的文件複製並粘貼到該目錄,然後再試一次。

如果這樣的話,那麼diff這與你的實現。我的猜測是,如果你得到這麼多,你有一個流浪的角色 - 可能是Unicode的空白空間 - 藏在你的一個文件中。

+0

感謝您的幫助!你的建議爲我做了訣竅:)但是,之前的一個問題是,在添加自動加載器之前,我在'example-plugin'目錄內使用了諸如由單獨的composer.json/autoload鏈接的'\ GuzzleHttp \ Client'類。 php文件位於'example-plugin/functions/api'中,解決了上述問題似乎打破了現有的自動加載器,爲什麼會出現這種情況,以及我將如何維持現有的功能? – AnchovyLegend

+0

您可以將自動載入定義移動到api子目錄的composer.json中,也可以將其自動載入移動到新的composer.json中,也可以確保各自的代碼路徑使用正確的autoload.php。然而,它震動了,最好讓所有的代碼同意使用相同的composer.json。 – bishop

+0

我很困惑。爲了澄清,GuzzleHttp \ Client是由作曲家安裝的依賴項,而不是我編寫的類。它位於'example-plugin/functions/api'內的'vendor'目錄內,該目錄與api目錄本地的composer.json文件位置相同。我試着將psr-4定義移動到那個文件中,但沒有成功......不知道如何讓'/ vendor'類和私人類同時工作 – AnchovyLegend

相關問題