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

次のパーティーでは、CakePHP 2.3 を使用してサンドイッチを提供する資格のある Jeeves を雇います。

あなたはジーブスに、義母にピーナッツバターのサンドイッチを提供するように頼みます。彼は CakePHP でそれを行う方法を知っているので、次のようになります。

serveSandwich('motherinlaw', 'peanut butter', 'orange juice');

ただし、Jeeves は互換性のないオーバーライドを知らないため、義理の母がオレンジ ジュースを手にピーナッツ バター サンドイッチに座っていることになります。

これを正しく行う方法

基本的に、2 つのアプローチを選択できます。

元のメソッドを呼び出す新しいメソッドを作成する

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 に答える