0

我需要像这样自定义 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);
}

如何正确定制?

谢谢你,

阿里雷萨

4

1 回答 1

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

额外的参数永远不会被其他控制器使用,因为他们不知道它存在,因此不会造成任何问题(只要它不是必需的参数)。

于 2013-04-29T23:20:18.197 回答