我已经试过寻找这个问题,并看到了一些答案,但没有运气…
我使用Slim Framework v3安装了composer php。
我在composer.json文件中使用PSR-4为我的文件使用自动加载,如下所示:
"autoload": { "psr-4": { "App\\": "App" } }
这是我的文件夹结构:
我使用Apache 2.4在本地Mac OS X El Capitan上运行它,一切都像魔术一样工作。 但是,当我上传到我的Production Linux服务器(也与Apache 2.4),自动加载似乎非常困惑,我得到这样的错误:
警告:包含(/ home / friendsapp / public_html / vendor / composer /../../ app / Middleware / AuthMiddleware.php):未能打开stream:/ home / friendsapp / public_html / vendor /composer php/ ClassLoader.php第412行
警告:include():打开'/home/friendsapp/public_html/vendor/composer/../../app/Middleware/AuthMiddleware.php'包含失败(include_path ='。:/ usr / lib / php:/ usr / local / lib / php')在412行的/home/friendsapp/public_html/vendor/composer/ClassLoader.php上
致命错误:第5行中的/home/friendsapp/public_html/public/index.php中找不到类“App \ Middleware \ AuthMiddleware”
我有我的class完全按照我的文件夹结构命名空间。
<?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\\
名称空间冲突导致的,而您的PSR-4声明指向/App
。
为避免冲突并映射指定目录的所有命名空间,可以使用classmap
的自动加载classmap
或config optimize-autoloader
(可选)选项来定义指定目录中所有文件和对象的物理路径作曲家加载。 此外,通过PSR-4声明,将尝试从App
命名空间路径声明中加载在classmap路径中找不到的任何文件。 例如,使用exclude-from-classmap
选项时。
"config": { "optimize-autoloader": true }, "autoload": { "psr-4": { "App\\": "App/" }, "classmap": [ "App/", ], }
在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
。
作为一种惯例,只要您将开发更改部署到您的生产环境中,您就需要运行php composer.phar install --no-dev -o
请参阅如何在使用Composer的开发/生产交换机时正确部署? 。 这样,使用php composer.phar update
从您的开发环境应用的更改将正确安装在生产环境中。