CakePHP 3 "Controller class XYZ could not be found." 仅在生产服务器上
CakePHP 3 "Controller class XYZ could not be found." only on production server
我有一个单独的 AppController 用于我网站的外部 API。
我可以在本地开发机器上使用 Postman 连接到 API 就好了,但是一旦我将文件移动到测试站点或生产站点,我就会收到 404 错误,例如 "Controller class Users could not be found."
{
"message": "Controller class Users could not be found.",
"url": "/api/tv/users/index",
"code": 404,
"file": "/var/www/html/site/vendor/cakephp/cakephp/src/Http/ControllerFactory.php",
"line": 100
}
Ubuntu16.04,阿帕奇,PHP7.
所有服务器(本地开发、测试和生产)上的代码和环境应该是相同的,但它只能在本地机器上运行。我什至不知道 post 的代码是什么,但这里有一些:
测试码Api/TV/UsersController:
namespace App\Controller\Api\TV;
class UsersController extends AppController
{
public function index()
{
$this->set([
'message' => 'Why wont you work?',
'_serialize' => [
'message'
]
]);
}
}
路线:
Router::prefix('api', function(RouteBuilder $routes) {
$routes->connect('/v2', [
'controller' => 'users',
'action' => 'login',
'_method' => 'GET'
]);
...
$routes->fallbacks('DashedRoute');
});
Router::prefix('api/v3', function(RouteBuilder $routes) {
$routes->setExtensions(['json']);
$routes->fallbacks('DashedRoute');
});
Router::prefix('api/tv', function(RouteBuilder $routes) {
$routes->setExtensions(['json']);
$routes->fallbacks('DashedRoute');
});
如您所见,我在不同的前缀上有几个不同的 API。只有最后一个不起作用(本地除外)。
我已经无计可施了。我知道答案就在眼前,但我需要其他人为我指出。
您的前缀的所有部分(由 /
分隔)正在使用 Inflector::camelize()
变形,这意味着 api/tv
变为 Api/Tv
用于文件系统查找,并且 Api\Tv
用于命名空间查找,因此您的路径和命名空间是错误的,因为 Tv
在区分大小写的文件系统上与 TV
不匹配。
长话短说,将 TV
文件夹和命名空间部分重命名为 Tv
。
我有一个单独的 AppController 用于我网站的外部 API。 我可以在本地开发机器上使用 Postman 连接到 API 就好了,但是一旦我将文件移动到测试站点或生产站点,我就会收到 404 错误,例如 "Controller class Users could not be found."
{
"message": "Controller class Users could not be found.",
"url": "/api/tv/users/index",
"code": 404,
"file": "/var/www/html/site/vendor/cakephp/cakephp/src/Http/ControllerFactory.php",
"line": 100
}
Ubuntu16.04,阿帕奇,PHP7.
所有服务器(本地开发、测试和生产)上的代码和环境应该是相同的,但它只能在本地机器上运行。我什至不知道 post 的代码是什么,但这里有一些:
测试码Api/TV/UsersController:
namespace App\Controller\Api\TV;
class UsersController extends AppController
{
public function index()
{
$this->set([
'message' => 'Why wont you work?',
'_serialize' => [
'message'
]
]);
}
}
路线:
Router::prefix('api', function(RouteBuilder $routes) {
$routes->connect('/v2', [
'controller' => 'users',
'action' => 'login',
'_method' => 'GET'
]);
...
$routes->fallbacks('DashedRoute');
});
Router::prefix('api/v3', function(RouteBuilder $routes) {
$routes->setExtensions(['json']);
$routes->fallbacks('DashedRoute');
});
Router::prefix('api/tv', function(RouteBuilder $routes) {
$routes->setExtensions(['json']);
$routes->fallbacks('DashedRoute');
});
如您所见,我在不同的前缀上有几个不同的 API。只有最后一个不起作用(本地除外)。
我已经无计可施了。我知道答案就在眼前,但我需要其他人为我指出。
您的前缀的所有部分(由 /
分隔)正在使用 Inflector::camelize()
变形,这意味着 api/tv
变为 Api/Tv
用于文件系统查找,并且 Api\Tv
用于命名空间查找,因此您的路径和命名空间是错误的,因为 Tv
在区分大小写的文件系统上与 TV
不匹配。
长话短说,将 TV
文件夹和命名空间部分重命名为 Tv
。