ホームページ  >  記事  >  バックエンド開発  >  Yii フレームワークコンポーネントとイベント動作管理の分析

Yii フレームワークコンポーネントとイベント動作管理の分析

不言
不言オリジナル
2018-06-19 14:19:342396ブラウズ

この記事では、主に Yii フレームワーク コンポーネントとイベント動作管理を紹介し、Yii フレームワーク コンポーネント管理と動作管理の原理と使用テクニックを詳細に分析します。必要な方は参考にしてください。

この記事では、Yii フレームワーク コンポーネント管理と動作管理について説明します。 Yii Framework コンポーネントとイベント動作管理の例。参考のために皆さんと共有してください。詳細は次のとおりです。

Yii は、大規模な Web アプリケーションを開発するためのコンポーネントベースの高性能 PHP フレームワークです。 CComponent はほぼすべてのクラスの基本クラスであり、コンポーネントとイベントの管理を制御します。そのメソッドとプロパティは次のとおりです。イベント (evnet、一部の場所ではフックと呼ばれます) と $_m 配列を格納します。行動(行動)を保存します。

コンポーネント管理

YII は純粋な oop フレームワークであり、クラス内の多くのメンバー変数は保護またはプライベートであり、CComponent の魔法のメソッドです。 PHP の __get() と __set() はプロパティにアクセスして設定するために使用されますが、これらのメソッドの機能はそれをはるかに超えています。以下では、__get() を使用して、

#
public function __get($name)
{
  $getter='get'.$name;
  if(method_exists($this,$getter))
    return $this->$getter();
  else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
  {
    // duplicating getEventHandlers() here for performance
    $name=strtolower($name);
    if(!isset($this->_e[$name]))
      $this->_e[$name]=new CList;
    return $this->_e[$name];
  }
  else if(isset($this->_m[$name]))
    return $this->_m[$name];
  else if(is_array($this->_m))
  {
    foreach($this->_m as $object)
    {
      if($object->getEnabled() && (property_exists($object,$name) || $object->canGetProperty($name)))
        return $object->$name;
    }
  }
  throw new CException(Yii::t('yii','Property "{class}.{property}" is not defined.',
    array('{class}'=>get_class($this), '{property}'=>$name)));
}

CComponent またはそのサブクラス オブジェクト インスタンス $obj->name の __get($name) メソッドを示します。

1. まず、インスタンスに getName() メソッドがあるかどうかを確認します。存在する場合は、ステップ 2 を実行します。通常、これらは CComponent サブクラスで予約されているイベントであり、method_exists($this,$name) を使用して、クラスのインスタンスに名前が存在するかどうかを判断し、存在しない場合は実行します。ステップ 3

3. 動作配列に名前が存在する場合は、変更された動作を返します。 存在しない場合は、ステップ 4 を実行します。

4. 動作配列内の動作を調べます。 array は CBehavior サブクラスのインスタンスであり、CBehavior It も CComponent のサブクラスであるため、再帰メソッドを使用してビヘイビアー内のメソッドを取得します。そうでない場合は、ステップ 5

5 を実行します。要求された属性は存在しません。

CComponent サブクラスでは __get() メソッドをオーバーロードできます。たとえば、コンポーネントの取得の判定を CModule に追加します。これにより問題が発生します。属性とコンポーネントの名前を同じにしないことが最善です。プログラムは最初にコンポーネントをロードし、必要な属性を取得できない可能性があるためです。名前を同じにする必要がある場合は、ゲッターを使用する必要があります。属性を取得します。

public function __get($name)
{
  if($this->hasComponent($name))
    return $this->getComponent($name);
  else
    return parent::__get($name);
}

コンポーネントのロードと作成に関して、以前の YII フレームワーク分析のメモ 1: YII 実行プロセスの 3 番目のポイントに疑問があります。登録フレームワーク コア 多数のコンポーネントを一度にロードするとパフォーマンスに影響しますか?実際にはいいえ、登録するときは、コンポーネントとそれに対応する構成をキーと値のペアの形式で配列に保存するだけです (プリロードされたものを除く)。それが使用されるときに、上記のようにコンポーネントを作成できます。 createComponent( in YIIBase ) メソッドによって作成され、初期化されます。 __get() または getComponent() を呼び出して CModule またはその子孫クラス (CWebApplication など) を通じてコン​​ポーネントを取得する場合、CModule は $_components 配列を通じてオブジェクト プールを確立し、各コンポーネントがリクエスト内で 1 回だけインスタンス化されるようにします。

イベント動作管理

イベントは、コンポーネントの拡張機能またはプラグインに相当し、コンポーネント内で予約されているフックは、外部への内部呼び出しを実装するために使用されます。コンポーネントと外部からのコンポーネントの部分的な制御。 CComponent サブクラスでは、js の onclick や onchange などと同様に、on で始まるメソッドをイベントとして定義できます。実際、原理は似ています。すべてのイベントは、CComponent と同じファイル内の CEvent のサブクラスです。

/**
* Raised right BEFORE the application processes the request.
* @param CEvent $event the event parameter
*/
public function onBeginRequest($event)
{
  $this->raiseEvent('onBeginRequest',$event);
}
/**
* Runs the application.
* This method loads static application components. Derived classes usually overrides this
* method to do more application-specific tasks.
* Remember to call the parent implementation so that static application components are loaded.
*/
public function run()
{
  if($this->hasEventHandler('onBeginRequest'))
    $this->onBeginRequest(new CEvent($this));
  $this->processRequest();
  if($this->hasEventHandler('onEndRequest'))
    $this->onEndRequest(new CEvent($this));
}

たとえば、CApplication で run() メソッドを呼び出す場合、リクエストを処理する前に、まず onBeginRequest イベントのハンドルが外部に渡されるかどうかを確認します。その場合、 pass onBeginRequest($event ) メソッドは CComponent の raiseEvent() メソッドを呼び出し、ハンドル内の関数またはメソッドを実行します。

Behavior はイベントのアップグレードされたバージョンであり、すべての Behavior は CBeavior のサブクラスです。上記の __get() メソッド分析のステップ 4 を分析すると、動作の役割はコンポーネントの特性 (プロパティ、メソッド、イベント、動作など) を完全に拡張することであり、これによりプログラム開発がより柔軟になることがわかります。

ビヘイビアーのもう 1 つの機能は、同様のイベント ハンドルをまとめて、attach() メソッドを実行するときに、events() メソッドで返されたイベント ハンドルをバインドすることです。これにより、アスペクトの管理と拡張が実現されます。の目標。たとえば、CModelBehavior はモデル関連のイベントを収集して、モデルに動作を追加する必要があるときにサブクラスの再利用を容易にします。

上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。

関連する推奨事項:

yii ページングコンポーネントの使用法について


Yii データでのルールクラスバリデーターの使用法についてモデル ###########################

以上がYii フレームワークコンポーネントとイベント動作管理の分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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