我需要像这样定制CakePHP Controller的flash()方法,
//$progressId variable is extra
//the error is customized method is not compatible with Controller::flash() method
public function flash($message, $url, $pause = 1, $progressIs, $layout = 'flash') {
$this->autoRender = FALSE;
$this->set('url', Router::url($url));
$this->set('message', $message);
$this->set('pause', $pause);
$this->set('page_title', __('action result title'));
$this->set('progress_is', $progressIs);
$this->render(FALSE, $layout);
}
如何正确自定义?
谢谢,
阿里
答案 0 :(得分:0)
您收到此错误的原因是'签名'自定义(重写)方法与原始方法不同。
覆盖方法时,请确保它与原始方法保持兼容。
想象一下这个例子;
public function serveSandwich($person, $sandwich, $drink = null)
{
find($person);
serve($person, $sandwich);
if ($drink) {
serve($person, $drink);
}
}
这很有效,这种方法可以让你为某人提供三明治和(可选)饮料,例如:
serveSandwich('motherinlaw', 'peanut butter', 'orange juice');
然而,这个功能并不符合您的要求,您希望在供应三明治之前为某人提供座位。
因此,您决定使用高级方法覆盖该方法;
public function serveSandwich($person, $furniture, $sandwich, $drink = null)
{
find($person);
havePersonSitOn($person, $furniture);
serve($person, $sandwich);
if ($drink) {
serve($person, $drink);
}
}
对于你的下一个派对,你雇用Jeeves,他有资格使用CakePHP 2.3提供三明治。
你要求Jeeves为你的婆婆服务一个花生酱三明治;他知道如何在CakePHP中做到这一点,所以会发生这种情况:
serveSandwich('motherinlaw', 'peanut butter', 'orange juice');
然而,Jeeves并不知道不相容的覆盖,所以你最终会和你的母亲一起坐在花生酱三明治上,手里拿着橙汁!
基本上,您可以选择两种方法;
public function seatAndServeSandwich($person, $furniture, $sandwich, $drink = null)
{
havePersonSitOn($person, $furniture);
$this->serveSandwich($person, $sandwich, $drink = null)
}
这是首选方式;为了使用高级功能,您显式地调用新方法,而新方法又调用原始方法
在你的情况下:
public function customflash($message, $url, $pause = 1, $progressIs, $layout = 'flash') {
$this->set('progress_is', $progressIs);
return $this->flash($message, $url, $pause, $layout);
}
这也可以,但是如果CakePHP的未来版本会向flash
方法添加新参数,可能会导致问题;
public function flash($message, $url, $pause = 1, $layout = 'flash', $progressIs = null) {
$this->set('progress_is', $progressIs);
return parent::flash($message, $url, $pause, $layout);
}
额外的参数永远不会被其他控制器使用,因为他们不知道它存在,因此没有问题(只要它不是必需的参数)。