サードパーティライブラリを使う

Yii は、より一層 Yii の機能性を拡張するために、容易にサードパーティライブラリを統合できるよう、入念に設計されています。 プロジェクトでサードパーティライブラリを使用する場合、開発者は、たびたびクラスの名前付けやファイルのインクルードに関する問題に直面します。 全ての Yii クラスは、C から始まるので、クラスの命名問題はそれほど起こらないでしょう。 また、Yii はクラスファイルのインクルードを行うために SPL autoload を使用しているので、他のライブラリがクラスファイルをインクルードするために、同じオートローディング機能か PHP インクルードパスを使っている場合には、お互いにうまく動作することが出来ます。

以下では、例として、Yii アプリケーションで Zend framework の、Zend_Search_Lucene コンポーネントを使用する方法を解説します。

まず、protectedアプリケーションベースディレクトリ と仮定し、Zend framework リリースファイルを protected/vendors ディレクトリ以下に展開します。 protected/vendors/Zend/Search/Lucene.php ファイルがある事を確認してください。

次に、コントローラクラスファイルの最初に、下記の行を追加します:

Yii::import('application.vendors.*');
require_once('Zend/Search/Lucene.php');

上記のコードで、クラスファイル Lucene.php をインクルードします。 相対パスを使用するため、正しくファイルを見つけられるように PHP インクルードパスを変える必要があります。 これは、require_once の前に、Yii::import をコールする事で行われます。

一旦上記のセットアップが完了すれば、下記のように、コントローラアクション中で Lucene クラスを使用できます。

$lucene=new Zend_Search_Lucene($pathOfIndex);
$hits=$lucene->find(strtolower($keyword));

1. 名前空間を持つサードパーティライブラリを使う

PSR-0 に準拠する名前空間を持ったライブラリ (例えば Zend Framework 2 や Symfony2) を使うためには、そのルートをパスエイリアスとして登録する必要があります。

例として、Imagine を使いましょう。 Imagine ディレクトリを protected/vendors の下に置いたとすると、次のようにすれば Imagin を使うことが出来るようになります。

Yii::setPathOfAlias('Imagine',Yii::getPathOfAlias('application.vendors.Imagine'));
 
// 次に Imagine のガイドにある標準的なコード
// $imagine = new Imagine\Gd\Imagine();
// 等々

上記のコードにおいて、エイリアスの名前の定義は、ライブラリで使用される名前空間の最初の部分と一致させなければなりません。

2. サードパーティのオートローダを使う

サードパーティのライブラリの中には (例えば PHPUnit のように) 自分自身のクラスオートローダを使うものがあります。 それらは、Yii のオートローダとは異なる規則によって、クラスファイルのインクルードを実行します。 Yii は PHP のインクルードパスをクラスファイルの「最後のソース」として使用するため、このような サードパーティのオートローダを登録すると PHP のワーニングが生ずることがあります。

include(PHPUnit_Framework_TestCase.php) [function.include]: failed to open stream: No such file or directory

このような問題を避けるためには、すべてのサードパーティのクラスオートローダを Yii のオートローダより前に登録して下さい。

require_once('PHPUnit/Autoload.php'); // サードパーティのオートローダを登録
require_once('/path/to/framework/yii.php'); // Yii のオートローダを登録
...

サードパーティのクラスオートローダが独立した関数やメソッドで提供されている場合は、 Yii::registerAutoloader() メソッドを使ってそれを登録しても構いません。 この場合、Yii は自動的に自分自身のオートローダの前にサードパーティのオートローダを登録します。

require_once('/path/to/framework/yii.php'); // Yii のオートローダを登録
...
Yii::registerAutoloader(array('SomeLibrary','autoload')); // サードパーティのオートローダを登録
...

さらに、PHP インクルードパスの使用を無効にすることで、サードパーティのオートローダに関する問題を避けることも出来ます。 そのためには、アプリケーションを開始する前に、YiiBase::$enableIncludePathfalse に設定します。

require_once('/path/to/framework/yii.php');
$configFile='/path/to/config/main.php';
Yii::$enableIncludePath = false; // PHP インクルードパスの使用を無効にする
Yii::createWebApplication($configFile)->run();

3. Yii をサードパーティのシステムで使う

また、Yii は、WordPress, Joomla などの既存のサードパーティシステムの開発や拡張をサポートするための自己充足的なライブラリとして使用することも出来ます。 そうするためには、次のコードをサードパーティシステムのブートストラップコードに含めます。

require_once('path/to/yii.php');
Yii::createWebApplication('path/to/config.php');

上記のコードは典型的な Yii アプリケーションで使われるブートストラップコードとほとんど同一ですが、ただ一点、ウェブアプリケーションのインスタンスを作成した後に、run() メソッドを呼ばないという違いがあります。

これによって、サードパーティの拡張機能を開発するときに、Yii によって提供されるほとんどの機能を使用することが可能になります。 例えば、Yii::app() を使ってアプリケーションインスタンスにアクセス出来ます。 また、DAO やアクティブレコードといったデータベース機能を使うことも出来ます。 さらに、モデルとバリデーションの機能も使うことが出来る、等々です。

$Id$

Be the first person to leave a comment

Please to leave your comment.