Epi*_*tax 3 php linux apache composer-php
我已经尝试过寻找这个问题并看到了几个答案,但没有运气......
我有使用Slim Framework v3安装的composer.
我在composer.json文件中使用PSR-4为我的文件使用自动加载,如下所示:
"autoload": {
"psr-4": {
"App\\": "App"
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的文件夹结构:
我在使用Apache 2.4的本地主机Mac OS X El-Capitan上运行它,一切都像魔术一样.但是当我将它上传到我的Production Linux服务器(也使用Apache 2.4)时,自动加载似乎非常困惑,我收到的错误如下:
警告:include(/ home/friendsapp/public_html/vendor/composer /../../ app/Middleware/AuthMiddleware.php):无法打开流:/ home/friendsapp/public_html/vendor /中没有此类文件或目录第412行的composer/ClassLoader.php
警告:include():无法打开'/home/friendsapp/public_html/vendor/composer/../../app/Middleware/AuthMiddleware.php'(include_path ='.:/ usr/lib/php:/第412行的/home/friendsapp/public_html/vendor/composer/ClassLoader.php中的usr/local/lib/php')
致命错误:第5行的/home/friendsapp/public_html/public/index.php中找不到"App\Middleware\AuthMiddleware"类
我根据我的文件夹结构完全命名了我的类.
<?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 {
Run Code Online (Sandbox Code Playgroud)
非常感激任何的帮助!:)
fyr*_*rye 10
看着错误中的路径 /app/Middleware/AuthMiddleware.php
看来问题是由生产环境中App\\ 指向的命名空间冲突引起的/app,而不是指向的PSR-4声明/App.
为了避免冲突并映射指定目录的所有命名空间,可以使用autoload classmap或config optimize-autoloader(可选)选项composer.json来定义指定目录中所有文件和对象的物理路径,以便加载composer.此外,对于PSR-4声明,将尝试从App命名空间路径声明中加载在类映射路径中找不到的任何文件.例如,使用该exclude-from-classmap选项时.
"config": {
"optimize-autoloader": true
},
"autoload": {
"psr-4": {
"App\\": "App/"
},
"classmap": [
"App/",
],
}
Run Code Online (Sandbox Code Playgroud)
在您进行更改后,请composer.json确保php composer.phar update --lock在您的开发环境中运行.
然后将composer.lock和composer.json文件上载到生产环境后,运行php composer.phar install --no-dev -o或php composer.phar dump-autoload --no-dev -o从生产环境中运行.
该-o选项将强制optimize-autoloader运行类映射,--no-dev并将阻止安装开发包(require-dev).使用optimize-autoloader建议用于生产环境.
作为一般惯例,无论何时将开发更改部署到生产环境,都需要运行在使用Composer的开发/生产开关时,php composer.phar install --no-dev -o请参阅如何正确部署?.这样,从您的开发环境中应用的更改将php composer.phar update正确安装在您的生产环境中.