部署Yii2应用到Heroku时遇ReflectionException错误求助
purrweb\heroku\HerokuGeneratorController类不存在的问题 这个错误本质是Yii的自动加载机制找不到你指定的控制器类,大概率是扩展未安装、配置有误或者自动加载缓存的问题,下面是具体的排查和解决步骤:
1. 先确认对应扩展包是否已安装
首先得确保purrweb/yii2-heroku这个扩展已经通过Composer装到项目里了。打开终端跑这个命令检查:
composer show purrweb/yii2-heroku
如果提示“Package purrweb/yii2-heroku not found”,那就执行安装命令:
composer require purrweb/yii2-heroku
装完之后再试试php yii heroku。
2. 检查控制器映射的配置是否准确
打开console/config/main-local.php,仔细核对你的controllerMap配置:
'controllerMap' => [ 'heroku' => [ 'class' => 'purrweb\heroku\HerokuGeneratorController', ], // 其他控制器配置... ],
注意Yii对命名空间和类名的大小写是敏感的,必须和扩展里的实际类名完全一致,别写错字母大小写。
3. 刷新Composer的自动加载缓存
有时候新安装的类不会立刻被Composer的自动加载器识别,这时候刷新缓存就好:
composer dump-autoload
跑完这个命令再重新执行php yii heroku试试。
4. 确认配置文件是否被正确加载
Yii的console应用默认是加载console/config/main.php,然后合并main-local.php的配置。你可以检查main.php里有没有这段加载代码:
$config = yii\helpers\ArrayHelper::merge( require __DIR__ . '/main.php', require __DIR__ . '/main-local.php' );
如果没有的话,得加上这段,不然你在main-local.php里加的控制器映射根本不会生效。
5. 手动检查扩展的文件结构
如果上面几步都没用,那就去项目的vendor/purrweb/heroku目录下看看,有没有HerokuGeneratorController.php这个文件,并且文件开头的命名空间是不是purrweb\heroku:
namespace purrweb\heroku; class HerokuGeneratorController extends \yii\console\Controller { // ... }
要是文件不存在或者命名空间不对,说明安装过程出问题了,卸载重装一下:
composer remove purrweb/yii2-heroku composer require purrweb/yii2-heroku
按这个顺序排查下来,基本就能解决类不存在的问题了。
内容的提问来源于stack exchange,提问作者arun webber

