我想在默认操作中处理我的一个控制器中的缺失操作。现在默认行为是抛出错误。我希望能够在该控制器中调用默认操作并传递所请求操作的名称,以便我可以对其执行某些操作。现在我知道你可以改变整个缺失的动作页面,这不是我想要做的。任何对此的煽动都会很棒,如果不可能请告诉我。
由于
答案 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建议的方式由于某些不同的原因对我不起作用:
routes.php
中定义的操作。但是来自URI的动作作为第一个参数传递。$this->action
,但可以使用$this->setAction()
我做了什么:
将所有来电路由到特定操作
Router::connect('/ajax/*', array('controller' => 'ajax', 'action' => 'handle'));
在此操作中解析调用
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'))));
}
希望这对某人有用。