2017-05-03 79 views
1

我有一個用CakePHP 3編寫的應用程序。我已經通過Composer安裝了Cake和其他軟件包。加載供應商/作曲家/ autoload_namespaces.php中未列出的Composer軟件包

最近的一次我安裝了fineuploader/php-traditional-serverhttps://packagist.org/packages/fineuploader/php-traditional-server)由 把這在我composer.json然後運行composer update

"require": { 
    "fineuploader/php-traditional-server": "1.1.0" 
} 

這已下載的文件按預期爲vendor/fineuploader/php-traditional-server

但是,如果我嘗試引用,在我的蛋糕控制器之一,是這樣的:

use UploadHandler; 

public function test() 
{ 
    var_dump(new \UploadHandler); 
} 

它錯誤說類「UploadHandler」未找到

我一直的唯一途徑能夠得到以上運行是通過硬編碼鏈接到適當的文件。因此,而不是use UploadHandler;

require_once(ROOT . DS . 'vendor/fineuploader/php-traditional-server/handler.php'); 

我在https://jtreminio.com/2012/10/composer-namespaces-in-5-minutes/閱讀vendor/composer/autoload_namespaces.php應該包含能夠自動載入的命名空間。但是當我打開這個文件時,沒有提到這個包(實際上只有大約3個,而我的vendor目錄有一些我可以使用的很好的包)。

那麼加載UploadHandler的正確方法是什麼?我認爲使用Composer的重點在於它自動加載這些文件,所以你沒有必須使用像require()

回答

2

您是否閱讀過handler.php文件中的註釋?

請勿直接從您的客戶端代碼使用或引用它。相反,這應該通過endpoint.php或端點cors.php文件(S)

所以AFAICT包不定義任何自動加載capabilites,因爲你不應該直接使用UploadHandler類需要,但是您應該要求endpoint.phpendpoint-cors.php文件,該文件不包含任何類,只應在需要時才需要。

肯定這些端點文件與CakePHP不兼容,所以您可能有理由直接使用處理程序類。然而,該軟件包不使用名稱空間,並且類名稱與文件名不匹配,即它既不遵循PSR-0也不遵循PSR-4慣例,並且如前所述,包composer.json未定義任何自動加載配置,因此不支持這個包遵循什麼約定,這將導致PHP類/文件包無自動加載功能。

所以,如果你想自動加載功能,你可以在你的最終通過例如添加classmap自動加載項,以您的項目composer.json,像解決這個問題:

{ 
    "autoload": { 
     "classmap": [ 
      "vendor/fineuploader/php-traditional-server/" 
     ] 
    } 
} 

然後再轉存到磁帶自動加載機和自動加載應做工精細:

$ composer dump-autoload 

又見

相關問題