我已经试着搜索这个问题,并看到了一些答案,但没有运气。。。
我已经用Slim Framework v3安装了composer。
我使用自动加载我的文件使用PSR-4在composer.json文件像这样:
"autoload": {
"psr-4": {
"App\\": "App"
}
}
这是我的文件夹结构:
我使用Apache2.4在本地主机Mac OS X El Capitan上运行它,一切都像魔术一样工作。但是,当我将其上传到我的生产Linux服务器(同样使用Apache 2.4)时,自动加载似乎非常混乱,我会遇到如下错误:
警告:include(/home/friendsapp/public_html/vendor/composer/./../app/Middleware/AuthMiddleware.php):无法打开流:在/home/friendsapp/public_html/vendor/composer/ClassLoader中没有这样的文件或目录。php在线412
警告:包括():失败打开/首页/朋友应用程序/public_html/供应商/作曲家/.../.../app/Middleware/AuthMiddleware.php包含(include_path='.:/usr/lib/php:/usr/本地/lib/php')在 /home/friendsapp/public_html/vendor/composer/ClassLoader.php行412
致命错误:在第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 {
任何帮助都将不胜感激!:)
查看错误/app/Middleware/AuthMiddleware中的路径。php
问题似乎是由生产环境中指向/App
的App\\
命名空间冲突引起的,而不是指向/App
的PSR-4声明。
为了避免冲突并映射指定目录的所有命名空间,您可以使用composer.json
中的autoloadclass map
或configOptimation-autoloader
(可选)选项来定义指定目录中的所有文件和对象,供作曲家加载。此外,对于PSR-4声明,将尝试从App
命名空间路径声明加载在类映射路径中未找到的任何文件。例如,当使用排除类映射
选项时。
"config": {
"optimize-autoloader": true
},
"autoload": {
"psr-4": {
"App\\": "App/"
},
"classmap": [
"App/",
],
}
在您的composer.json
中进行更改后,请确保在您的开发环境中运行phpcomposer.phar更新--lock
。
然后在上传composer.lock
和composer.json
文件到正式生产环境后,运行phpcomposer.phar安装--no-dev-o
或phpcomposer.phar转储-自动加载--no-dev-o
从正式生产环境。
-o
选项将强制运行optimize autoloader
类映射,并且--no dev
将阻止安装开发包(require dev
)。建议在生产环境中使用optimize autoloader
。
通常情况下,每当您将开发更改部署到正式生产环境时,您需要运行phpcomposer.phar安装--no-dev-o
。这样,从您的开发环境中使用phpcomposer.phar更新
应用的更改就可以正确地安装在您的正式生产环境中。
对于我的生产服务器,以下操作有效:
composer install --no-dev -o
然后重新启动php
在serverpilot上:
rm -rf vendor/*
composer5.6-sp install --no-dev -o
sudo service php5.6-fpm-sp restart