我有一个API wirtten,并给出了如何使用它的说明。
例如,要测试登录信息,您可以拨打/api/login
现在我在日志中看到有人一直在调用/API/LOGIN
并收到错误500.
有什么方法可以在调用/api/
控制器函数时捕获这些错误吗?
在这种情况下,我想发回一个像Error. Wrong function call
这样的回复。
当错误500发生时,我不想发送它。实际上只有在/api/
相关时。
报告的错误属于我在AppController::beforeFilter()
中调用类似
$this->Api->check($username)
我在debug = 2
时遇到此错误Call to a member function check() on a non-object
当我致电/api/login/
时,功能完美无缺。
我期待任何提示!谢谢!
答案 0 :(得分:1)
您遇到的问题不在于操作的大小(在PHP方法名称中不区分大小写),而是控制器的大小写。它找不到APIController
,因此抛出一个丢失的控制器异常。然后,当AppController
被CakeErrorController
扩展时,会调用$this->Api
。
我只能假设CakeErrorController
引用模型,并且由于实际控制器是Dispatcher.beforeDispatch
,因此该模型当然不会被加载,因此非对象错误。< / p>
有多种方法可以解决这个问题,我个人可能会挂钩// 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
如果{{1}}控制器被定位,这将强制使用控制器和操作的小写。
然而,如前所述,方法名称不区分大小写,因此从技术角度来看,强制执行小写操作并不是必需的。无论如何,它只是一个例子...