SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Zend Framework入門

コマンドラインからのPHPアプリケーション管理
- Zend_Tool -

Zend Frameworkによる実践的なPHPアプリケーション開発 25

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つあります。

 

  1. サンプルのパスをphp.ini に追加する
  2. IncludePathLoader.phpの62行目を書き換えて、「.」から始まるパスも許容するようにする。
if (!file_exists($path) || $path[0] == '.') {

 ▼

if (!file_exists($path)) {

 この原稿では2.の方法を選んだものとして説明を続けますが、いずれの方法もセキュリティ的にはよくない方法なので、サンプルを実行し終わったら元に戻すようにしてください。

プロバイダの作成

 それでは、簡単なプロバイダを作成してみましょう。プロバイダは最低限、Zend_Tool_Framework_Provider_Interfaceインターフェイスを実装している必要があります。このインターフェイスは中身は空で、単純にそれを実装したクラスがプロバイダであることを示す印になっています。また、名前については次のような規約があります。

プロバイダクラスの名前の規約
名前 規約
クラス名 (モジュールの名前)_(プロバイダの名前)
メソッド名 (アクションの名前)

 ここで、モジュールの名前はこのプロバイダがどのモジュールの一部として実装されているかを示していますが、現時点では特に制約はないようです。また、プロバイダの名前は先頭だけ大文字にする必要があります。例えば「say」アクションを持つ「Hello」プロバイダは次のようになります。

[リスト1]HelloProvider.php
<?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!」と表示されます。では、これを実行してみましょう。このファイルのあるフォルダに移動してください。

[リスト2]HelloProvider.phpを実行
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はウェブページへのリンクを管理するためのモジュールで、メニューや特定のページへのリンクを作成するのに利用することができます。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
Zend Framework入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 風田 伸之(カゼタ ノブユキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4489 2009/11/18 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー