Zend_Toolの拡張
次に、Zend_Toolの動作を少し眺めて見ながら、プロバイダを追加する方法について見ていきます。最初に述べたように、プロバイダはZend_Toolの実際の機能を提供している部分です。プロバイダを追加することで、Zend_Toolの機能も自由に拡張することができます。実は、この追加の方法は非常に単純で、標準の状態ではPHPのインクルードパスにプロバイダのクラスを設置するだけでうまくいきます。
その仕組みを、まずZend_Toolで使うクラスを探すローダの動作から見ていきましょう。
標準ローダの動作
ローダは「Zend_Tool_Framework_Loader_Abstractクラス」を継承しているクラスで、Zend Toolで利用するプロバイダやクライアントなどを必要に応じて見つけて読み込む(loadする)ためのクラスです。標準では「Zend_Tool_Framework_Loader_IncludePathLoader」が利用されます。
このZend_Tool_Framework_Loader_IncludePathLoaderは名前の通り、PHPのインクルードパスを調べてプロバイダやマニフェストを探します。このZend_Tool_Framework_Loader_IncludePathLoaderは次の条件でファイルを探して来ます。
- インクルードパスのうち、「.」から始まる以外について、そのパスの下にあるファイルをすべて調べる
- ファイル名が「Manifest.php」ないし「Provider.php」で終わるものを選択
このように、インクルードパスの下のどこかにプロバイダクラスを記述したファイルやZend_Toolのマニフェストを記述したファイルがあれば、自動的に読み込むようになっています。
上に書いたように、「.」から始まるインクルードパスは無視されるようになっています。このようにしておくことで、悪意あるコードによる被害が少なくなるようにしているのですが、実は少し困ったことがあります。というのも、これではカレントディレクトリも無視してしまうため、サンプルをそのまま実行することができなくなるからです。解決方法としては2つあります。
- サンプルのパスをphp.ini に追加する
- IncludePathLoader.phpの62行目を書き換えて、「.」から始まるパスも許容するようにする。
if (!file_exists($path) || $path[0] == '.') {
▼
if (!file_exists($path)) {
この原稿では2.の方法を選んだものとして説明を続けますが、いずれの方法もセキュリティ的にはよくない方法なので、サンプルを実行し終わったら元に戻すようにしてください。
プロバイダの作成
それでは、簡単なプロバイダを作成してみましょう。プロバイダは最低限、Zend_Tool_Framework_Provider_Interfaceインターフェイスを実装している必要があります。このインターフェイスは中身は空で、単純にそれを実装したクラスがプロバイダであることを示す印になっています。また、名前については次のような規約があります。
| 名前 | 規約 |
| クラス名 | (モジュールの名前)_(プロバイダの名前) |
| メソッド名 | (アクションの名前) |
ここで、モジュールの名前はこのプロバイダがどのモジュールの一部として実装されているかを示していますが、現時点では特に制約はないようです。また、プロバイダの名前は先頭だけ大文字にする必要があります。例えば「say」アクションを持つ「Hello」プロバイダは次のようになります。
<?php
require_once 'Zend/Tool/Framework/Provider/Interface.php';
class Default_Hello
implements Zend_Tool_Framework_Provider_Interface//Provider_Interfaceを実装
{
public function say()//アクション名
{
echo "Hello World!\n";
}
}
ここでは「Zend_Tool_Framework_Provider_Interface」を実装した「Default_Hello」クラスを定義しています。このクラスには「say」という名前のメソッドが定義されており、このメソッドが実行されると「Hello World!」と表示されます。では、これを実行してみましょう。このファイルのあるフォルダに移動してください。
C:\samples\provider>\ZendFramework-1.9.1\bin\zf.bat say hello Hello World!
ここで、クラス名は「...Hello」なのに、プロバイダ名は「hello」であることに注意してください。このように、Zend_Toolの機能を簡単に拡張することができることが分かると思います。
不要になったデータベースのエントリを削除したり、定期的にアプリケーションの状態を報告するメールを自動送信するのにスクリプトを作成することはよくあることだと思います。このスクリプトをZend_Toolのプロバイダとして記述しておけば、アプリケーションの管理をZend_Toolで一元化することができます。
また、現段階ではZend_Toolに提供されているクライアントはコンソールだけのものとなっていますが、将来他のクライアントが提供されるようになれば、このプロバイダはそのまま他のクライアントから利用できるようになる可能性が高くなります。
おわりに
今回はZend_Toolに標準で提供されている機能の一覧と、Zend_Toolを拡張する方法について説明しました。Zend_Toolの提供するコマンドラインインターフェイスをそのまま利用しつつ、Zend_Toolのプロバイダを追加することで機能を簡単に拡張できることがお分かりいただけたと思います。
次回はZend_Navigationモジュールの紹介を行いたいと思います。Zend_Navigationはウェブページへのリンクを管理するためのモジュールで、メニューや特定のページへのリンクを作成するのに利用することができます。
