是否有可能在Cakephp中拦截一个没有发现动作的事件并在控制器中处理它


Is it possible in Cakephp it intercept a no action found event and handle it in the controller?

我想在默认操作中处理我的一个控制器中的缺失动作。现在默认的行为是抛出一个错误。我希望能够有一个默认的动作在那个控制器被调用,并通过请求的动作的名称,所以我可以用它做一些事情。现在我知道你可以改变整个失踪的行动页,这不是我要做的。任何关于这个的激励都将是伟大的,如果不可能的话,请告诉我。

谢谢

根据这对您的正常操作的异常程度,更改路由可能更有意义:

Router::connect('/mycontroller/*',
                array('controller' => 'mycontroller', 'action' => 'catchall'));

如果你在那个控制器中有一些正常的动作,在这个全包路由之前为它们定义一个路由,让它们正常处理。

如果你真的想摆弄控制器本身的动作处理,你应该能够在beforeFilter:

中这样做
public function beforeFilter() {
    if (!method_exists($this, $this->action)) {
        unshift($this->params['pass'], $this->action);
        $this->action = 'catchall';
    }
}

至少是这样的,这只是一个快速的未经测试的想法。

我遇到了同样的问题。我必须防止json响应控制器的默认HTML错误页面。

由于一些不同的原因,@ decze建议的方法对我不起作用:

  1. 在使用通配符路由到特定操作之后,调用的操作始终是您在routes.php中定义的操作。但是URI的动作被作为第一个参数传递。
  2. 不能覆盖$this->action,但可以使用$this->setAction()

我做了什么:

  1. 将所有调用路由到特定操作

    Router::connect('/ajax/*', array('controller' => 'ajax', 'action' => 'handle'));
    
  2. 解析这个动作中的调用

    public function beforeFilter() {
        $this->autoRender = false;
    }
    public function index($arg1 = false) {
        return new CakeResponse(array('body' => json_encode(array('foo' => $arg1))));
    }
    public function handle($action = '') {
        if (method_exists($this, $action)) {
            return call_user_func_array(array($this,'setAction'),  func_get_args());
        } else {
            return $this->_error();
        }
    }
    private function _error() {
        return new CakeResponse(array('body' => json_encode(array('status' => 'error'))));
    }
    

希望对大家有所帮助