2016-08-29 92 views
2

我已經嘗試過尋找這個問題,並看到一對夫婦的答案,但沒有運氣...作曲家和Linux的生產服務器 - 自動加載不工作

我有修身框架v3一起安裝的作曲家。

我使用我的文件自動加載在這樣的composer.json文件中使用PSR-4:

"autoload": { 
"psr-4": { 
    "App\\": "App" 
} 
} 

這是我的文件夾結構:

enter image description here

我運行它在使用Apache 2.4的本地主機Mac OS X El-Capitan上運行,一切都像魔術一樣。 但是,當我把它上傳到我的生產Linux服務器(也與Apache 2.4),自動加載似乎是極其混亂,我收到錯誤這樣的:

Warning: include(/home/friendsapp/public_html/vendor/composer/../../app/Middleware/AuthMiddleware.php): failed to open stream: No such file or directory in /home/friendsapp/public_html/vendor/composer/ClassLoader.php on line 412

Warning: include(): Failed opening '/home/friendsapp/public_html/vendor/composer/../../app/Middleware/AuthMiddleware.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in /home/friendsapp/public_html/vendor/composer/ClassLoader.php on line 412

Fatal error: Class 'App\Middleware\AuthMiddleware' not found in /home/friendsapp/public_html/public/index.php on line 5

我已經命名空間我的班完全按​​我的文件夾結構體。

<?php 

namespace App\Middleware; 

use \Psr\Http\Message\ServerRequestInterface as Request; 
use \Psr\Http\Message\ResponseInterface as Response; 

use \App\Middleware\Middleware; 

use \App\Share\ErrorCode; 
use \App\Models\ResultMessage; 

use \App\Mappers\AccessTokenMapper; 

class AuthMiddleware extends Middleware { 

任何幫助將不勝感激! :)

+1

您是否在服務器上運行'composer install'? – Chris

+0

或'composer dump-autoload' –

+0

難道我不應該在服務器上這樣做嗎? (至少這是我通過閱讀關於這個問題的一些評論而理解的) – EpicSyntax

回答

8

中的錯誤/app/Middleware/AuthMiddleware.php

望着路徑它出現的問題是由App\\命名空間衝突所指向/app在生產環境中,而不是你的PSR-4聲明指向/App造成的。

爲了避免衝突,並映射所有指定目錄的命名空間,你可以以定義指定目錄中的所有文件和對象的物理路徑使用自動加載classmap或配置optimize-autoloader(可選)選項composer.json作曲家加載。此外,使用PSR-4聲明時,將嘗試從App命名空間路徑聲明中加載未在類映射路徑中找到的任何文件。例如,使用exclude-from-classmap選項時。

"config": { 
    "optimize-autoloader": true 
}, 
"autoload": { 
    "psr-4": { 
     "App\\": "App/" 
    }, 
    "classmap": [ 
     "App/", 
    ], 
} 

作出改變你composer.json後,一定要在你的開發環境中運行php composer.phar update --lock

然後composer.lockcomposer.json文件上傳到生產環境後,運行從生產環境php composer.phar install --no-dev -ophp composer.phar dump-autoload --no-dev -o

-o選項將迫使optimize-autoloader classmapping運行和--no-dev將防止開發包(require-dev)的安裝。建議在生產環境中使用optimize-autoloader


按照一般慣例,任何時候你部署你需要運行php composer.phar install --no-dev -oHow to deploy correctly when using Composer's develop/production switch?到生產環境的變化發展。這樣,使用php composer.phar update從開發環境應用的更改將正確安裝在您的生產環境中。

+0

這實際上是一個很好的答案,解決了我的問題!我通過SSH登錄並運行「php composer.phar dump-autoload -o」,一切似乎都正常。也感謝一般的做法,我一定會採用它們。 – EpicSyntax

+0

記住,composer.phar會自動運行在'--dev'模式下,所以除非你需要生產環境*中的'require-dev'依賴*(比如phpunit,phpspec,behat和codesniffer等)*,您可以通過添加'--no-dev'開關來避免安裝這些依賴關係(否則可能會使用開發庫打開潛在的漏洞)。 – fyrye

+0

非常感謝 – Sahadev