我有一个使用Slim框架的api(版本3)。项目结构在根目录中有一个api目录。在其中我有“控制器”,“模型”,“公共”,“src”等的dirs,以及我的composer.json和供应商(曾经运行作曲家安装)。我的控制器都有名称空间“App \ Controllers”,而composer.json有
"psr-4": {
"App\\": ""
}
在自动加载中定义。在点击路线时,我正在呼叫我的控制器(例如App.Controllers \ AccountController:login)。所有这些在我的流浪环境中都能正常工作,但是一旦我将它上传到我的生产服务器(共享主机,我将整个api dir从我的本地环境中删除到共享主机中的public_html目录),我得到了
输入:RuntimeException
消息:Callable App \ Controllers \ AccountController不存在
档案:/home/downunde/public_html/api/vendor/slim/slim/Slim/CallableResolver.php
行:62
#0 /home/downunde/public_html/api/vendor/slim/slim/Slim/CallableResolverAwareTrait.php(45):Slim \ CallableResolver-> resolve('App \ Controllers ...')
#1 /home/downunde/public_html/api/vendor/slim/slim/Slim/Route.php(314):Slim \ Routable-> resolveCallable('App \ Controllers ...')
#2 /home/downunde/public_html/api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(116):Slim \ Route-> __ invoke(Object(Slim \ Http \ Request),Object(Slim \ HTTP \响应))
#3 /home/downunde/public_html/api/vendor/slim/slim/Slim/Route.php(297):Slim \ Route-> callMiddlewareStack(Object(Slim \ Http \ Request),Object(Slim \ HTTP \响应))
#4 /home/downunde/public_html/api/vendor/slim/slim/Slim/App.php(441):Tlim \ Route-> run(Object(Slim \ Http \ Request),Object(Slim \ HTTP \响应))
#5 /home/downunde/public_html/api/vendor/slim/slim/Slim/MiddlewareAwareTrait.php(116):Slim \ App-> __ invoke(Object(Slim \ Http \ Request),Object(Slim \ HTTP \响应))
#6 /home/downunde/public_html/api/vendor/slim/slim/Slim/App.php(337):Slim \ App-> callMiddlewareStack(Object(Slim \ Http \ Request),Object(Slim \ HTTP \响应))
#7 /home/downunde/public_html/api/vendor/slim/slim/Slim/App.php(298):Slim \ App->进程(对象(Slim \ Http \ Request),对象(Slim \ HTTP \响应))
#8 /home/downunde/public_html/api/public/index.php(52):Slim \ App-> run()
#9 {main}
两个服务器都是apache,PHP v.5.6。我确认它正确地命中了路线,但是在共享主机上它无法找到我的控制器。
答案 0 :(得分:6)
您应该像这样编辑composer.json
:
"autoload": {
"psr-4": {
"App\\": ""
}
},
"require": {
// ...
},
"scripts": {
// ...
}
和dependencies.php
// PagesController
$container['PagesController'] = function ($container)
{
return new \App\Controller\PagesController;
};
接下来,您更新了自动加载
$ composer dump-autoload -o
抱歉我的英文......
答案 1 :(得分:3)
很幸运,这是一个案例问题。如果你在Windows上本地,请记住你不区分大小写。
当您使用Linux时,您将获得区分大小写的环境。
Windows-Linux的案例问题是一个常见问题。尝试使用vagrant或任何其他方法来拥有相同的本地和非本地环境。
答案 2 :(得分:2)
这是由于区分大小写。不确定为什么它在本地工作但不在共享主机上工作。