0

DomainPageという 2 つの別個のモデルを持つ Yii アプリケーションがあります。ドメインには一意のフィールドがあるため、ルール ( ) を設定し'domain', 'unique'、フィールドが新しい場合は新しいレコードを作成し、それ以外の場合は既存のレコードを使用して ID を返すアクションも作成します。

$domain_model=new Domain();
$domain_model->domain=$domain;
if(!$domain_model->save()){
    $atts = array('domain'=>$domain);
    $domain_model=Domain::model()->findByAttributes($atts);
}
return $domain_model->id;

これは問題なく動作しますが、ページコントローラー内では、ページ挿入アクション中に同じ関数を呼び出したいと考えています。Yii でこれを行うための最適な DRY メソッドがわかりません。他のモデル コントローラーにアクセスできないため、ドメインMVCの内外でアクセスできるようにするために、この関数をどこに配置すればよいかわかりません。

4

2 に答える 2

1

このような動作を定義し、それを使用したい任意のクラスにアタッチします。

コンポーネント動作の使用

コンポーネントはミックスインパターンをサポートし、1 つまたは複数の動作に関連付けることができます。ビヘイビアとは、特殊化 (つまり、通常のクラス継承) ではなく、機能を収集する手段を通じて、接続されたコンポーネントによってメソッドを「継承」できるオブジェクトです。コンポーネントは複数の動作に関連付けることができるため、「多重継承」を実現できます。

動作クラスはIBehaviorインターフェイスを実装する必要があります。ほとんどの動作は、CBehavior基本クラスから拡張できます。動作をモデルに関連付ける必要がある場合は、モデル固有の追加機能を実装するCModelBehaviorまたはCActiveRecordBehaviorから拡張することもできます。

ビヘイビアを使用するには、ビヘイビアのattach()メソッドを呼び出して、最初にコンポーネントにアタッチする必要があります。次に、コンポーネントを介してビヘイビア メソッドを呼び出すことができます。

// $name uniquely identifies the behavior in the component
$component->attachBehavior($name,$behavior);
// test() is a method of $behavior
$component->test();

添付された動作は、コンポーネントの通常のプロパティのようにアクセスできます。たとえば、tree という名前の動作がコンポーネントにアタッチされている場合、次を使用してこの動作オブジェクトへの参照を取得できます。

$behavior=$component->tree;
// equivalent to the following:
// $behavior=$component->asa('tree');

コンポーネントを介してメソッドを使用できないように、動作を一時的に無効にすることができます。例えば、

$component->disableBehavior($name);
// the following statement will throw an exception
$component->test();
$component->enableBehavior($name);
// it works now
$component->test();

同じコンポーネントに関連付けられた 2 つの動作が同じ名前のメソッドを持っている可能性があります。この場合、最初にアタッチされたビヘイビアのメソッドが優先されます。

eventsと一緒に使用すると、動作はさらに強力になります。ビヘイビアーは、コンポーネントにアタッチされると、そのメソッドの一部をコンポーネントのイベントにアタッチできます。そうすることで、動作はコンポーネントの通常の実行フローを観察または変更する機会を得ます。

ビヘイビアーのプロパティには、アタッチされているコンポーネントからもアクセスできます。プロパティには、パブリック メンバー変数と、動作のゲッターやセッターを介して定義されたプロパティの両方が含まれます。たとえば、動作に xyz という名前のプロパティがあり、その動作がコンポーネント $a に関連付けられているとします。次に、式$a->xyzを使用して動作のプロパティにアクセスできます。

詳細:
http://www.yiiframework.com/wiki/44/behaviors-events
http://www.ramirezcobos.com/2010/11/19/how-to-create-a-yii-behavior/

于 2012-07-16T12:20:51.913 に答える
0

DomainYii については正確には覚えていませんが、モデルに使用できる「beforeSave」コールバックがあると思います。そうすれば、ドメインモデルを保存するときに、常に「モデルを保存する前にこのIDが既に存在するかどうかを確認してください」が呼び出されます。

その後、以前に存在したかどうかに関係なく、単に を実行し$domain->save();、その後に を実行します。$domain->id

于 2012-07-16T12:32:29.130 に答える