トップページ > 1. ドキュメント > 1.2. CharcoalPHPの基本 > 1.2.1. 基本知識 > コンポーネントの使い方

コンポーネントの使い方

コンポーネントとは

 アプリケーションで共通の機能を、他のアプリケーションでも使いたいときがあります。また、PEARなどライブラリの形で提供されているプログラムや、あるいは他のフレームワーク用のコンポーネントを使いたい場合もあるかもしれません。そのような時、CharcoalPHPのコンポーネントとして実装しておくと、複数のアプリケーション(または別プロジェクト)で有用なコードを共有することができます。

 そのために、CharcoalPHPのコンポーネントの仕組みは以下のことができます。

  • iniファイルによるコンポーネントの統一的な初期化
  • コンポーネントのライフサイクルの指定(セッション・リクエスト・一時オブジェクト)
  • モジュール機構による動的な読みこみ(put-and-run)

コンポーネントの基本的な使い方

 CharcoalPHPコンポーネントの使い方は基本的に

  1. コンポーネントのインスタンスを生成する
  2. コンポーネントのメソッドを呼び出す

の順で行います。

 まず、コンポーネントのインスタンスを作成しますが、その方法には2通りあります。

  • イベントコンテキストから生成する
  • コンテナから直接生成する

 以下の例を見てわかるように、いずれも生成は1ステップで終わります。

 2つの方法で生成されたオブジェクトに違いはありませんが、前者は通常のタスク内で記述する方法で、後者の方法はイベントコンテキストのないスコープ(グローバル関数など)でも使用することができます。

 コンポーネントのインスタンスが生成できたら、あとはコンポーネントに実装されたメソッドを呼び出すだけです。

初期設定ファイルによるコンポーネントの初期化

 Charcoalコンポーネントは、Charcoalオブジェクトと互換性があります。つまり、configディレクトリまたはmoduleディレクトリにある設定ファイルから初期値を自動的に読み取り、適用させることができます。

 以下はQdMailコンポーネントの初期設定ファイルの例です。

 初期設定ファイルで特に重要なのはclass_nameエントリとscopeエントリです。class_nameはコンポーネントクラス名を表します。
CharcoalPHPコンポーネントコンテナはclass_nameエントリを参照し、コンポーネントのインスタンスを生成し初期設定ファイルを読み込んで適用します。

 scopeエントリはコンポーネントの生存期間を表します。以下の3種類の値が使用できます。

scopeの設定値 コンポーネントの生存期間
transient 一時的なオブジェクト。getComponentされる毎にインスタンスが生成される
request リクエストにつき1度だけ生成される(HTTPの場合、1回のリクエストにつき1インスタンス
session セッションが持続している間、1度だけ生成される

 通常、コンポーネントはrequestスコープを持ちます。transientでは毎回オブジェクトが生成されてしまうため、メモリ効率が悪化します。sessionスコープは便利ですが、あまり使いすぎるとセッションデータが大きくなり過ぎてしまい、アプリケーション全体のパフォーマンスが低下してしまいます。requestスコープならば、1リクエスト内で生成したインスタンスは使いまわされ、初期化処理は1度で済みますので効率的です。またセッションにデータを保存しないため、アプリケーションのパフォーマンスが落ちることもありません。

 SmartGatewayコンポーネントをrequestスコープで使用することでデータベースへの接続処理を最初の1回だけにすることができます。2回目以降の使用では(たとえそれが別のタスクであっても)最初に初期化したインスタンスが使用されるため、最初に作成したインスタンスで既に接続済みであれば2度目以降にgetComponentしたコンポーネントでは接続処理はスキップされます。

 コンポーネントの初期化方法は初期設定ファイルで行う以外に、configureメソッドでも行うことができます。この場合、先にコンテナでインスタンスを生成しておき、Charcoal_Configオブジェクトに設定値をセットしてconfigureメソッドを呼び出します。

コンポーネントの自動ローディング

 CharcoalPHPコンポーネントはCharcoalPHPモジュール機構により動的にローディングすることができます。つまり、プロシージャ同様オブジェクトパスにより必要なクラスをPHPのrequire/includeやauto_load関数を書かずに自動的に読み込むことができます(ただし、CharcoalPHPのクラスローダーは必要になります)。

 この仕組みにより、コンポーネントの配置場所を気にすることなくコンポーネントをロード・使用することができるので、プログラマーはビジネスロジックの実装に集中することができます。

Pocket

Comments are closed.