カスタム (オーバーライドされた) メソッドの「署名」が元のものと異なるため、このエラーが発生しています。
メソッドをオーバーライドするときは、元のメソッドと互換性があることを確認してください。
この例を想像してみてください。
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);
}
追加のパラメーターは、他のコントローラーによって使用されることはありません。他のコントローラーはそれが存在することを認識していないため、問題は発生しません (必須パラメーターでない限り)。