自定义CakePHP Controller的flash()方法

时间:2013-04-24 10:29:14

标签: cakephp-2.3

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

如何正确自定义?

谢谢,

阿里

1 个答案:

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

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