0

我编写了一个 API,并给出了如何使用它的说明。例如,要测试登录,您可以调用/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/这些函数时,它们完美无缺。

我期待任何提示!谢谢!

4

1 回答 1

1

您面临的问题不是操作的大小写(在 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控制器成为目标。

但是,如前所述,方法名称不区分大小写,因此从技术角度来看,不需要强制小写操作。无论如何,这只是一个例子......

于 2014-06-26T11:15:28.100 回答