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

时间:2011-08-31 20:36:40

标签: php cakephp cakephp-1.3

我想在默认操作中处理我的一个控制器中的缺失操作。现在默认行为是抛出错误。我希望能够在该控制器中调用默认操作并传递所请求操作的名称,以便我可以对其执行某些操作。现在我知道你可以改变整个缺失的动作页面,这不是我想要做的。任何对此的煽动都会很棒,如果不可能请告诉我。

由于

2 个答案:

答案 0 :(得分:2)

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

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';
    }
}

至少这样的事情,这只是一个快速未经考验的想法。

答案 1 :(得分:1)

我遇到了同样的问题。我不得不阻止JSON响应控制器的默认HTML错误页面。

@deceze建议的方式由于某些不同的原因对我不起作用:

  1. 使用通配符路由到特定操作后,调用的操作始终是您在routes.php中定义的操作。但是来自URI的动作作为第一个参数传递。
  2. 您无法覆盖$this->action,但可以使用$this->setAction()
  3. 我做了什么:

    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'))));
      }
      
    3. 希望这对某人有用。