4

Yiiのドキュメントでは、「イベントが適切に発生するように、必ず親実装を呼び出すようにしてください」と読むことがよくあります。beforeSave、beforeValidate、afterSave..の場合

私が見たYiiブログチュートリアルでは:

protected function beforeSave()
{
    if(parent::beforeSave())
    {
        ...
        return true;
    }
    else
        return false;
}

if関数はどうしたのですか?

私も簡単に見ました:

protected function afterSave()
{
    parent::afterSave();
    ...
}

と:

protected function beforeValidate()
{
    ...
    return parent::beforeValidate();
}

なぜ時々parent::function呼び出しをif-functionでラップするのですか?
parent :: function();を呼び出すだけでも問題ありません。最初にそれを返すか、最後にそれを返しますか?

4

1 に答える 1

10

それはあなたが何をしたいかによります。

beforeSaveメソッドとbeforeValidateメソッドは、afterSaveとafterValidateができないかどうかにかかわらず、trueまたはfalseを返すことにより、保存/検証の以降のプロセスに影響を与える可能性があることを知っておく必要があります。また、 attachEventHandlerメソッドを使用して、1つのイベントハンドラーだけでなく、任意の数のイベントハンドラーをアタッチできることも知っておく必要があります。したがって、これを考慮すると、複数のイベントハンドラーがある場合、beforeSaveメソッドとbeforeValidateメソッドの場合、親関数を呼び出す場所は重要です。それ以外の場合はそうではありません。

たとえば、モデルにbeforeSave()ハンドラーがあり、別のクラスでこのイベントをサブスクライブしている場合(すべてオブザーバーパターンに基づいています。イベントをより深く理解するために、このイベントについて読むことをお勧めします)。beforeSave()メソッドを実装する場合、他のイベントハンドラーを機能させるには、parent :: beforeSave()を呼び出す必要があります。また、何らかの理由でモデルを保存しないことにした場合は、他のイベントハンドラーを実行するかどうかを選択できます。したがって、他のイベントハンドラーを起動せずに、すぐにfalseを返すことができます(一部のリソースを節約できる場合もあります)。

独自のbeforeSave()ハンドラーが他のアタッチされたハンドラーよりも重要でないと考える場合は、最初にparent :: beforeSave()を呼び出し、その結果を確認して(最初の例で行ったように)、他のイベントハンドラーに応じてコードを実行する必要があります。することにしました。

通常、モデルに追加のイベントハンドラーはありません(ある場合は、おそらく自分で質問を理解する必要があります)。そのため、最後の例のように、returnステートメントでいつでも親メソッドを呼び出すことができます。また、保存または検証を中断する場合は、代わりにfalseを返します。

于 2013-01-06T15:54:46.347 に答える