コンポーネントの仕組みはYiiのシステム全体の思想的本質です。Yiiを使用する前に、まずコンポーネントの仕組みを理解する必要があります。この仕組みが理解できない場合は、Yiiのソースコードを読むと理解できます。とても難しいでしょう。コンポーネントメカニズムは Yii フレームワークに無限の柔軟性と拡張性を与えます Yii フレームワークの基本構造はコンポーネントであると言っても過言ではありません。 CApplication オブジェクト、コントローラー、ルート マネージャー (urlManager) と同じくらい大きくても、他のプラグインと同じくらい小さくても、それらはすべてコンポーネントの形式で存在します。
Yiiコンポーネントとは何ですか?
インスタンス化してCComponent から継承できる Yii のほとんどすべてのクラスをコンポーネントと呼ぶことができます。
コンポーネントの特徴は何ですか?
CComponent クラスから継承され (直接継承または間接継承)、イベントおよび動作メカニズムがあり、そのさまざまなプロパティを構成ファイルで定義できます。
コンポーネントを作成するには?
カスタム クラスを作成し、それを CComponent クラスから継承します。
CComponent クラスは、すべてのコンポーネントの基本クラスです。このクラスは、Yii フレームワークで重要です。具体的には、このクラスは主に次の 3 つの関数を実装します。
1. phpのマジックメソッド__set、__getを使用して、クラスの属性を定義します。つまり、コンポーネントの属性は、定義された public メンバー属性の使用に加えて、CComponent によって実装された関数を使用して、setXXX、getXXX メソッドを拡張することで属性の設定と取得を拡張することもできます。一部の特殊な属性については、設定時に正しい形式であることを確認する必要がある場合があります。これはこの場合に役立ちます。
クラスのWebページはCComponentを拡張します {
公開 $title;
プライベート $_url;
パブリック関数 setUrl($value='') {
if(is_url($value)){
$this->_url = $value;
}
}
パブリック関数 getUrl() {
$this->_url を返す ;
}
}
$page = 新しいウェブページ();
$page->title = "ページタイトル";
$page->url = "/index.php"; # $page->seturl("/index.php");を呼び出します。 echo $page->url #$page->geturl();
言い換えると、コンポーネントで
setXXX、getXXXが定義されている場合、クラスの外で通常の属性アクセス フォームを使用できます。
2.
setter、getterを使用してイベント処理インターフェイスのバインディングを実装します。イベントメカニズムは Yii にも遍在しており、Yii はコンポーネント間の関数呼び出し (オブザーバーパターン) を実装するために多数のイベントメカニズムを使用します。 では、コンポーネントのイベントを定義するにはどうすればよいでしょうか? Yii
は、以下に定義されているように、イベントと呼ばれるフォームonXX のメソッドを規定します。
公開関数 onSubmit($event) {
$this->raiseEvent('onSubmit', $event);
}
}
上記の修正されたコードを使用して、car コンポーネントの onStop イベントが作成されます。しかし、バインディング イベントは正確には何に使用されるのでしょうか?イベントをバインドする機能は、コンポーネントが一連のイベントを生成したときに、イベント ハンドラーを通じてバインドされた各オブジェクトに独自のイベントを通知することです。たとえば、フォームが送信されたときにこのイベントをログ コンポーネントに通知し、記録させたいとします。 $form = 新しいフォーム(); $form ->attachEventHandler( 'onSubmit', array($logOjbect, "saveLog") ); $form->data = $_POST; $form->onSubmit( new CEvent($form, array('data'=>$_POST) ) ); #イベントの実行をアクティブ化し、イベント処理インターフェイスを呼び出しますlogObject::saveLog そして、logObjectのコードは次のようになります: パブリック関数 saveLog($event) { $event->sender === $form; $event->params ; } } 明らかに、この方法は従来の呼び出し方法よりもはるかに柔軟で概念的に高度です。 さらに、setterメソッドを使用してイベントをバインドすることができます: $form->onSubmit = array($logOjbect, "saveLog") ; 注: form クラスは、onSubmit メンバー属性を定義しません。 同時に、Yiiは、JavaScriptのaddEventListenerと同様に、複数の処理インターフェースを同じイベントにバインドするメカニズムを実装します。 イベントハンドラーインターフェースLiuyaは、phpのcallback型形式を標準として使用しています。詳細については、http://php.net/manual/en/ language.types.callableを参照してください。 php YiiのCLogRouter::init()のコードのような: もちろん、Yii::app()->onEndRequest = array($this,'processLogs'); onEndRequestイベントはCApplicationで定義されています: if(!$this->_end){ $this->_ended=true; $this->raiseEvent('onEndRequest',$event); } } イベントを定義し、プロセッサをイベントにバインドするだけでは十分ではありません。イベントは、CApplication::run() メソッドのロジックなど、適切な場所でアクティブ化する必要があります。
$this->onBeginRequest(new CEvent($this)); $this->processRequest(); if($this->hasEventHandler('onEndRequest')) $this->onEndRequest(new CEvent($this)); }
イベントを定義し、イベント処理インターフェイスをバインドし、イベントをアクティブ化する
yiiの動作メカニズムは、他のオブジェクトのメソッドやプロパティを直接使用するコンポーネントとして単純に考えることができます( で導入されたtrait構造のように、動作と同様の機能があります)
特性 SayWorld { パブリック関数 SayHello() { world!'; } } クラス MyHelloWorld は Base { SayWorld を使用します; } $o = 新しい MyHelloWorld(); $o->sayHello(); hello world! ビヘイビアは、さまざまなイベントとその処理手順を定義する特別なクラスです。まず、イベントとそれに対応するメソッドを含むビヘイビア クラスを定義します。 クラス MyAppBehavior は CBehavior を拡張します { public $status = "アプリの動作が終了しました。";
戻り配列 ( # NendRequest インシデント
);
}
パブリック関数 appEnd($event = null) { echo get_class($this); } }
$form->属性 = $_POST ; $form->attachBehavior )
'クラス' => '',
'strip_tags' => true 、 )); $form->filter(new CEvent($form) ) ; }
CBehavior { public $strip_tags = false ;
パブリック関数イベント() { 配列を返す( 'フィルター' => 'フィルターHtml', ); }
$input = $event->sender->属性 ; $event->sender->attributes = $this->filter($input); } }
} }
Yii の個人的な簡単な理解
class logObject {
Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));
public function onEndRequest($event){
if($this->hasEventHandler('onBeginRequest')) (転載元: http://zhangxugg-163-com.iteye.com/blog/1673325)
コンポーネント: インスタンス化して CComponent から継承できる Yii のほぼすべてのクラスは、コンポーネントと呼ぶことができます。
イベント: コンポーネント間で呼び出すためのクラスメソッド。識別子として on で始まります。
動作: 特性特性と同様、コンポーネントが直接使用する特別なクラスです。