ホームページ  >  記事  >  バックエンド開発  >  (転送)Yiiのコンポーネント機構の一つ:コンポーネント基本クラスの解析 CComponent_PHPチュートリアル

(転送)Yiiのコンポーネント機構の一つ:コンポーネント基本クラスの解析 CComponent_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:27:32833ブラウズ

Yiiのコンポーネントの仕組み

コンポーネントの仕組みは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('on
Submit'
,
$event);

}

}

上記の修正されたコードを使用して、car コンポーネントの onStop イベントが作成されます。しかし、バインディング イベントは正確には何に使用されるのでしょうか?イベントをバインドする機能は、コンポーネントが一連のイベントを生成したときに、イベント ハンドラーを通じてバインドされた各オブジェクトに独自のイベントを通知することです。たとえば、フォームが送信されたときにこのイベントをログ コンポーネントに通知し、記録させたいとします。

$form = 新しいフォーム();

$form ->attachEventHandler( 'onSubmit', array($logOjbect, "saveLog") );

$form->data = $_POST;

$form->onSubmit( new CEvent($form, array('data'=>$_POST) ) ); #イベントの実行をアクティブ化し、イベント処理インターフェイスを呼び出しますlogObject::saveLog

そして、logObjectのコードは次のようになります:
class logObject {

パブリック関数 saveLog($event) {

$event->sender === $form;

$event->params ;

}

}

明らかに、この方法は従来の呼び出し方法よりもはるかに柔軟で概念的に高度です。

さらに、setterメソッドを使用してイベントをバインドすることができます:

$form->onSubmit = array($logOjbect, "saveLog") ;

注: form クラスは、onSubmit メンバー属性を定義しません。

同時に、Yiiは、JavaScriptaddEventListenerと同様に、複数の処理インターフェースを同じイベントにバインドするメカニズムを実装します。

イベントハンドラーインターフェースLiuyaは、phpcallback型形式を標準として使用しています。詳細については、http://php.net/manual/en/ language.types.callableを参照してください。 php

YiiCLogRouter::init()のコードのような:
Yii::app()->attachEventHandler('onEndRequest',array($this,'processLogs'));

もちろん、Yii::app()->onEndRequest = array($this,'processLogs');

のように書くこともできます。

onEndRequestイベントはCApplicationで定義されています:
public function onEndRequest($event){

if(!$this->_end){

$this->_ended=true;

$this->raiseEvent('onEndRequest',$event);

}

}

イベントを定義し、プロセッサをイベントにバインドするだけでは十分ではありません。イベントは、CApplication::run() メソッドのロジックなど、適切な場所でアクティブ化する必要があります。

パブリック関数 run(){


if($this->hasEventHandler('onBeginRequest'))

$this->onBeginRequest(new CEvent($this));

$this->processRequest();

if($this->hasEventHandler('onEndRequest'))

$this->onEndRequest(new CEvent($this));

}

言い換えると、コンポーネントのイベント メカニズムを実装するには、

イベントを定義し、イベント処理インターフェイスをバインドし、イベントをアクティブ化する

必要があります。

行動メカニズム

yiiの動作メカニズムは、他のオブジェクトのメソッドやプロパティを直接使用するコンポーネントとして単純に考えることができます(

php 5.4

で導入されたtrait構造のように、動作と同様の機能があります) 特性 SayWorld {

パブリック関数 SayHello() {

echo 'hello

world!';

}

}

クラス MyHelloWorld は Base {

を拡張します

SayWorld を使用します;

}

$o = 新しい MyHelloWorld();

$o->sayHello();

hello world!

を出力

ビヘイビアは、さまざまなイベントとその処理手順を定義する特別なクラスです。まず、イベントとそれに対応するメソッドを含むビヘイビア クラスを定義します。

クラス MyAppBehavior は CBehavior を拡張します {

public $status = "アプリの動作が終了しました。";

パブリック関数イベント() {

戻り配列 (

) Re 'OnendRequest' = & GT; 動作の呼び出し後の、指定されたコンポーネントの

#

NendRequest インシデント ); }

パブリック関数 appEnd($event = null) {

echo get_class($this);

}

}

$app->attachBehavior('myapp','MyAppBehavior');

$app->run();

echo $app->ステータス ;

動作のメソッドとプロパティはコンポーネントで直接使用できることがわかりました。

もう 1 つの一般的な例は、ユーザーが HTML タグを入力できないようにするなど、ユーザーが入力したコンテンツをフィルタリングする必要がある場合です。この場合、それを処理するために動作メカニズムを使用することも検討できます。

$form = 新しい FormModel;

If($_POST) {

$form->属性 = $_POST ;

$form->attachBehavior

('myFilter', array(

)

'クラス' => '', 'strip_tags' => true 、

));

$form->filter(new CEvent($form) ) ;

}

class myHtmlFilter は

CBehavior {

を拡張します

public $strip_tags = false ; パブリック関数イベント() {

配列を返す(

'フィルター' => 'フィルターHtml',

);

}

パブリック関数 filterHtml($event) {

if($event->CFormModelの送信者インスタンス) {

$input = $event->sender->属性 ;

$event->sender->attributes = $this->filter($input);

}

}

パブリック関数フィルター(&$data) {

return is_array($data)?array_map(array($this, 'filter'),$data):strip_tags($data);

}

}

上記の例を通じて、動作メソッドをコンポーネントの通常のメソッドとして直接実行できることがわかります。動作の利点をまだ十分に理解していないのですが、動作は何に役立ちますか?

(転載元: http://zhangxugg-163-com.iteye.com/blog/1673325)

Yii の個人的な簡単な理解
コンポーネント: インスタンス化して CComponent から継承できる Yii のほぼすべてのクラスは、コンポーネントと呼ぶことができます。
イベント: コンポーネント間で呼び出すためのクラスメソッド。識別子として on で始まります。
動作: 特性特性と同様、コンポーネントが直接使用する特別なクラスです。

http://www.bkjia.com/PHPjc/815978.htmlwww.bkjia.com本当http://www.bkjia.com/PHPjc/815978.html技術記事 Yii のコンポーネントのメカニズム コンポーネントのメカニズムは、Yii のシステム全体の思想的な本質です。このメカニズムを理解していない場合は、まず Yii のソースを読んでください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。