您面临的问题不是操作的大小写(在 PHP 中方法名称不区分大小写),而是控制器的大小写。它不会找到APIController
并因此抛出丢失的控制器异常。然后,您AppController
将被调用,因为它正在被扩展,CakeErrorController
用于错误。
我只能假设它$this->Api
指的是一个模型,并且由于实际的控制器是CakeErrorController
,该模型当然没有被加载,因此是非对象错误。
有多种方法可以解决这个问题,我个人可能会加入Dispatcher.beforeDispatch
事件并抛出异常或在必要时定义适当的响应,如下所示:
// app/Config/bootstrap.php
App::uses('CakeEvent', 'Event');
App::uses('CakeEventManager', 'Event');
CakeEventManager::instance()->attach(
function(CakeEvent $event) {
$controller = $event->data['request']->params['controller'];
$action = $event->data['request']->params['action'];
if(strtolower($controller) === 'api') {
$response = $event->data['response'];
if($controller !== 'api') {
$response->statusCode('403');
$response->body('Invalid controller message');
return $response;
}
if(strtolower($action) !== $action) {
$response->statusCode('403');
$response->body('Invalid action method');
return $response;
}
}
},
'Dispatcher.beforeDispatch',
array('priority' => 11)
);
这将强制使用小写的控制器和动作,以防api
控制器成为目标。
但是,如前所述,方法名称不区分大小写,因此从技术角度来看,不需要强制小写操作。无论如何,这只是一个例子......