ソフトウェア・フレームワークは、アプリケーションで要求される基本的なことのすべてを標準的な方法で処理するように設計されたコード・ライブラリーの集合です。そのためアプリケーション開発者は、決まりきった処理を毎回作り直す必要がなくなり、新しい開発に時間をかけられるようになります。オープンソースの PHP 開発フレームワークには十数種類の選択肢がありますが、それらの中で Zend Framework はおそらく最もよく利用されています。
Zend の特徴はベスト・プラクティスを非常に重視していることであり、これはアプリケーションが継続的に利用できることを重んじる開発者にとっては大きな魅力です。また Zend は、極めてモジュール化が進んだフレームワーク構成になるように努めています。つまり Zend Framework のコンポーネント群の大部分は、その 1 つだけを完全に取り出して単独で使用することができ、これは Zend の中にあるライブラリーの一部のみを使いたいと思っている開発者にとって魅力的です。Zend の持つ柔軟性、それと同時にベスト・プラクティスの重視による確固とした標準化によって、Zend は広範な目的にかなった現実的なフレームワークになっています。
Zend Framework は既に強力ですが、V1.5 では、いくつかのまったく新しいコンポーネントと、また既存のコンポーネントに対する機能強化が行われています。このアップグレードによって、複雑な PHP アプリケーションの開発が今まで以上に容易になり、またフォーム検証のルーチンや、さらにはフロントエンドのレイアウト作成などに関する標準的な処理が実装されたことで、アプリケーションの保守も一層容易になります。ではまず、Zend_Form コンポーネントと、このコンポーネントが何を提供するのかを調べてみましょう。
Zend Framework に追加された機能の中でも非常に魅力的なものの 1 つが Zend_Form コンポーネントです。Web アプリケーションは、入力されたデータを取得してそれを処理する機能がないと、ほとんど使い物になりません。そしてユーザーからデータを取得するための最も簡単な方法は、フォームを使うことです。もちろん、フォームに関する作業は、Web アプリケーションを開発して保守する作業の中で最も退屈なものになりがちです。つまり入力されるすべてのデータを検証し、その入力が想定と一致していることを確認し、しかも入力データのすべてを個別に処理しなければなりません。しかもそうした作業は、エラー・メッセージを生成して最初から全部やり直し、といったことが必要ない場合の話です。しかし当然ながら、入力されたデータにエラーがあることによるやり直しは発生します。そのための処理の作成は、コードを再利用できないとしたら、手動で行うにはあまりにも膨大な作業になります。
新しいフォーム・コンポーネントは、単純にフォームとフォーム要素をプログラムで作成するという以上のことができます。Zend_Form は複雑な検証を行うことができ、さらに検証の結果が失敗の場合にはフォームにエラー・メッセージを表示することができます。
Zend_Form の使い方はとても単純です。まず form オブジェクトをインスタンス化し、そのアクションとメソッドを設定します。次に、フォーム要素を form オブジェクトに追加し、フォーム要素のバリデーターとフィルターを個々のフォーム要素に適用します。完成した form オブジェクトはアプリケーションの中で描画されて使用され、フォームへの入力があるとその結果が検証され、フィルターにかけられます。リスト 1 は単純なフォームの例を示しています。
リスト 1. 単純なフォーム
require_once 'Zend/Form.php';
$form = new Zend_Form(array(
'method' => 'post',
'elements' => array(
'name' => array('text', array(
'required' => true,
'label' => 'Name',
'validators' => array('alpha')
)),
'age' => array('text', array(
'required' => true,
'label' => 'Age',
'validators' => array('digits')
)),
'submit' => array('submit', array(
'label' => 'Send'
))
),
));
|
リスト 1 の結果を図 1 に示します。
図 1. リスト 1 のフォーム
Zend_Form に含まれている要素は、button、checkbox、hidden、image、multichckbox、multiselect、password、radio、reset、select、submit、text、textarea です。また Zend_Form に含められる要素は Zend_Form に初めから含まれている要素に限定されるわけではありません。Zend_Form に組み込まれている Zend_Form_Element クラスを使って独自の要素を作成することもできます。
またフォーム要素を手動でインスタンス化してフォームに追加したり、あるいは必要なタイプの新しいフォーム要素を form オブジェクトが作成したりインスタンス化したりするようにもできます。すべての要素は必要に応じて個別に構成することができ、個々の要素が form オブジェクトに追加される前、あるいは追加された後に、完成したフォームが描画される前であればいつでも、個々のバリデーターとフィルターのセットをそのフォーム要素に追加することができます。
フォーム要素に対してそのまま使用できる標準的な検証のタイプは 19 種類あります。これらのバリデーターは、通常収集が必要なほとんどすべてのデータ型をチェックすることができます。つまり単純なデータ型の検証から正規表現の突き合わせ、そして E メール・アドレスの検証までを行うことができます。E メール・アドレスの検証では、そのトップ・レベル・ドメインが存在すること、そして MX レコードがあることを確認することができます。バリデーターが偽を返す場合には残りの検証チェックは行われないようなデフォルト設定になっていますが、そのパラメーターも個々のバリデーターごとに構成することができます。
リスト 1 では、name フィールドに alpha バリデーターが適用され、age フィールドに digit バリデーターが適用されています。すべてをリスト 1 のデフォルトの状態のまま、これらの検証テストに失敗するようなデータを入力した場合に、どのような結果になるかを示したものが図 2 です。
図 2. 検証テストに失敗した場合のフォーム
バリデーターが用意できたら、次のステップはフィルターを適用することです。バリデーターは酒場の用心棒のように動作する、という言い方をするなら、フィルターは専任のスタイリストのように動作する、と言うことができます。つまりフィルターはフォーム要素の中のデータを取り入れ、出力側に現れて欲しくないものをフィルタリングし、そしてフィルターを通り抜けたものを渡します。標準で組み込まれているフィルターは 12 種類あり、空白を削除するフィルター、数字入力からアルファベットを削除するフィルター、テキストを大文字に変更するフィルター、特殊文字を HTML エンティティーに変換するフィルター、許可されないタグを削除するフィルターなどがあります。フィルターを使用するのは、必要なデータがフィールドの中にあることがわかっており、そのデータから余分なものを削除して、少しばかりデータに加工するという作業が必ず必要とされる場合です。
単純なフォームでフィルターが実際にどのように動作するのかを示すために、elements 配列を変更してみましょう。
リスト 2.
elements 配列にフィルターを適用する
'elements' => array(
'name' => array('text', array(
'required' => true,
'label' => 'Name',
'validators' => array('alpha'),
'filters' => array('StringToUpper')
)),
'age' => array('text', array(
'required' => true,
'label' => 'Age',
'validators' => array('digits'),
'filters' => array('digits')
)),
'submit' => array('submit', array(
'label' => 'Send'
))
),
|
これを見るとわかるように、name フィールドをすべて大文字に変更するフィルターを追加し、また age から数字以外のものをすべて削除する別のフィルターを追加しています。このフォームに、図 3 のような値を入力して送信すると以下のような結果が得られます。
図 3. フィルターを適用したフォーム
Send をクリックすると、検証とフィルターを通った後の次のような値が得られます。
図 4. 検証とフィルターが適用された後のフォーム
age 入力、フィルター、バリデーター、そしてこの特定の組み合わせに必要な属性によって、age 入力の値のどこかに数字が含まれている場合しか検証にパスしないこと、そして数字と一緒に入り込んだ余分なものがサーバーに渡されることがないことを効果的に保証することができます。また name フィールドに対する検証にパスするには、まずこのフィールドの入力値がすべてアルファベットで構成されていなければならないことに注意してください。name フィールドの値がすべてアルファベットで構成されている場合、用心棒による検証にパスするためにフィルターがすることは何もありません。
完成したフォームを描画するための方法はいくつかあります。フォームには、直接使用したりエコー出力したりできる render メソッドがあります。しかし大部分のフォームでは Zend_View ヘルパーを使用します。
Zend Framework V1.5 の新しい Zend_Layout コンポーネントと機能強化された Zend_View コンポーネントは同時に取り上げられることが多いのですが、それにはそれなりの理由があります。つまり、これらのコンポーネントを組み合わせて利用することによって PHP アプリケーションのコントローラーから表示を適切に分離して表示の標準化をすることができるため、迅速な開発と保守が行えるようになるのです。
このことは一体何を意味するのでしょうか。
それはつまり、Zend の精神に従ってコードをモジュール化しておく限り、標準化された、今までよりもずっと楽な方法で、一貫性のあるフロントエンドを維持管理できるようになったということです。
Zend_Layout を使う場合、必ずしも MVC (Model-View-Controller) にとらわれる必要はありません。大部分の Zend Framework と同じように、Zend_Layout は単独で取り出して使うことができます。しかし MVC で使用する場合には、Zend_Layout は Zend_View とコントローラーとの間の便利なアダプターのような役割を担えるため、実質的に表示が 2 段階のビューに分けられ、サイトのレイアウトが一層汎用的なものになります。
MVC を使うにせよ、Zend_Layout をスタンドアロンのコンポーネントとして取り出すにせよ、少なくとも 1 つのレイアウト・スクリプトを作成する必要があります。レイアウト・スクリプトは他の実装ではテンプレートと呼ばれることもあり、Web ページのフロントエンドの基本的な構造を定義します。しかしレイアウト・スクリプトは、(ページの中で) 表示されるデータがページごとに異なる部分 (あるいはもっと正確には、アクションごとに異なる部分) に、静的データではなく変数を使用します。こうした、レイアウト・スクリプトの中のプレースホルダー変数にデータを追加するためには、そのレイアウト・スクリプトに必要な値をレイアウトに割り当てます。それよって、どの特定のレイアウト・スクリプトを使いたいのかをレイアウトに指示し、最終的にそのレイアウト・スクリプトをページとして描画するのです。
実際の描画は Zend_View が行います。Zend_Layout を使う限り、Zend_View のすべての機能を無料で手に入れることができます。レイアウト・スクリプトは最終的にはいくつものビュー・ヘルパーで構成されるはずであり、そうでなければ、まず確実に何かが誤っています。ビュー・ヘルパーは、まさに便利さと標準化の大部分が入り交じったところで役に立つのです。
レイアウト・スクリプトが用意できると、ブートストラップの中で Zend_Layout のインスタンスを作成することができ、またレイアウトの構成オプションを設定することができます。このようにインスタンス化できると、アクションから (アクション・ヘルパーによって) Zend_Layout オブジェクトにアクセスしたり Zend_Layout オブジェクトを再構成したりできるようになります。アクションの内部では、Zend_Layout のインスタンスがどのレイアウト・スクリプトを使うのかをプログラムで変更することができ、また各レイアウト・スクリプトが必要とする現在の変数に再度値を入力することもできます。コントローラーの観点から見ると、最終的にユーザーに表示されるデータは適当なアダプターの中に押し込まれるだけであり、このアダプターがそのデータを取り上げ、まったく異なるスコープで使うのです。
OpenID は多くの Web サイトにまたがって使われるように設計された、一元化されていない ID プロトコルです。OpenID では、ユーザーは正しいユーザー名とパスワードの組み合わせを要求されるのではなく、既存の OpenID プロバイダーから入手した URL または XRI を入力するように促されます。そして、認証はそのプロバイダーによって行われます。OpenID プロバイダーが認証を行うための 1 つの方法では、InfoCard を要求します。認証を要求しているサイトとプロバイダーが通信して認証に成功すると、そのユーザーはログインしたと見なされ、そのユーザーの個人の URL からさらに情報を取得することができます。
Zend Framework V1.5 では OpenID と InfoCard を使うことができますが、クライアント・サイトで利用できるだけではなく、OpenID Provider が利用することもできます。これらのコンポーネントは完全に独立しており、お互いの間に依存関係はありません。不思議に思えるかもしれませんが、Zend Framework V1.5 では、OpenID 対応ではない OpenID Provider を作成することができ、またその逆も可能です (逆の方が妥当に思えます)。また Zend Framework に組み込まれた InfoCard コンポーネントもあり、このコンポーネントは OpenID と併せて使われる InfoCard の Relying Party (つまり OpenID への対応) をサポートしています。
Lucene は情報取得のためのオープンソースの検索エンジンであり、フルテキスト・インデックス機能とインターネット検索機能で最もよく知られています。Zend_Search_Lucene コンポーネントは、Zend Framework V1.5 に組み込まれている、フルテキストの高度な検索エンジンの機能を提供します。ただし注意点として、Lucene は検索エンジンですがクローリング機能は持っていないので、関連するすべてのコンテンツを手動で Zend_Search_Lucene のインデックスに追加する必要があります。(「参考文献」には Lucene に関する developerWorks の記事を挙げてあります。)
Zend_Search_Lucene コンポーネントが登場したのは Zend Framework V1.5 が最初ではありません。この検索エンジンの以前のバージョンは、既に Zend Framework の以前のリリースに実装されていました。しかし Zend Framework V1.5 のリリースでは Lucene のバージョンは V1.9 から V2.2 へと大幅なアップグレードが行われています。このアップグレードによって、Lucene コンポーネントには 3 つの強力な高度な検索手法が追加されました。
Lucene の V2.2 で現在サポートされている検索手法には、単一のワイルドカードによる検索と複数のワイルドカードによる検索の両方のほかに、範囲検索やあいまい検索があります。範囲検索は指定されたフィールドの中で上限と下限の間にある値を探し、またあいまい検索はユーザーが提供した検索後に似た言葉を探します。例えば「Mike」であいまい検索すると、「bike」や「mire」が返されるかもしれません。
Lucene コンポーネントはアップグレードされましたが、古い機能もそのまま残っています。そして既存のすべてのインデックスは、機能強化された Zend_Search_Lucene コンポーネントがそれらを初めて利用すると自動的にアップグレードされます。
LDAP (Lightweight Directory Access Protocol) がようやく Zend Frameworkでサポートされるようになりました。これは、会社の中に既に存在する正式なクレデンシャルを利用した企業イントラネット・アプリケーションを作成しなければならない開発者などを始めとする、かなり多くの開発者にとって良い知らせです。ただし Zend Framework の現在のドキュメンテーションによれば、現在のサポート・レベルは単に最低限の実装にすぎず、Zend_Auth_Adapter_LDAP を動作させるために必要な最低限の機能しか提供していないとのことです。
LDAP サーバーに関する情報は config.ini ファイルの中で指定します。ユーザーが認証を行おうとする場合には、提供されたユーザー名とパスワードの組み合わせ、そしていくつか追加の Zend_LDAP オプションが、.ini ファイルに指定されている LDAP サーバーに送信され、認証が行われます。他のすべての認証アダプターと同じように、Zend_Auth_Adapter_Ldap はサーバーから Zend_Auth_Result を取得できると即座にそれを返します。この動作に関しては以下のメソッドを使うことができます。getCode() は何が起きたのか (成功したか失敗したか) を示すコードを返し、getIdentity() は認証のための試行の ID を返します。getMessages()s は失敗した認証に対するメッセージのみを含み、isValid() はユーザーが無事認証されると真を返します。
新たな Web サービス、Nirvanix、Technorati、そして SlideShare
3 つの新たな Web サービス・コンポーネントが Zend Framework V1.5 に登場しました。それが Nirvanix と Technorati、そして SlideShare です。
Nirvanix はインターネット・ベースのファイル保存システムであり、登録されたユーザーはその API を利用してファイルの保存、操作、そしてファイルへのアクセスを行うことができます。Nirvanix は大規模なメディア・ファイル (例えばビデオなど) を扱えるように、またインターネットから認証可能な任意の場所でそれらのファイルを利用できるように設計されています。
Technorati はブログ用の検索エンジンであり、Technorati の Web サービスを利用することで、Technorati のデータベースに対していくつか異なる種類のクエリーを実行することができます (例えばキーワードによる通常の検索や、タグ検索、最上位タグ検索、ある指定のキーワードに対する、毎日のブログの合計の計算、特定の URL へのリンクを含む結果を返す「Cosmos」検索など)。Technorati を利用することで、今日ネット上で何がホットなのかを素早く知ることができ、またその結果を活用することができます。
slideshare.net は登録されたユーザーのスライドショーをホストする Web サイトです。SlideShare コンポーネントを利用すると、SlideShare がホストするスライドショーを PHP アプリケーションの中に組み込んだり、登録したスライドショーを表示したり、また新しいスライドショーを SlideShare のアカウントにアップロードしたりすることができます。
これらの 3 つのコンポーネントが、Zend Framework で既にサポートされている Web サービスのリストに追加されるのです。この、成長を続ける Web サービス・コンポーネントのライブラリーを利用することによって、十ヵ所を超える人気の Web サイトのコンテンツを任意の PHP アプリケーションに素早く容易に統合することができます。Zend Framework の他の部分がなくてもこれらの Web サービス・コンポーネントを個別にインストールできるという事実は、PHP 開発の世界が初めての開発者にも、また単に異なるフレームワークで作業することを好む経験豊富な PHP 開発者にも、特に大きな魅力です。
次に、以前からの機能やコンポーネントに対する機能強化で注目に値するものを調べてみましょう。こうした機能やコンポーネントは、常に変化を続けるインターネットの世界での新たな要求に適切に対応するために変更が必要だったものです。
Zend_GData コンポーネントは基本的に、Google のさまざまなサービスに対する巨大なアダプターであり、GData API をサポートしています。Zend_GData コンポーネントから利用できる GData サービスには、以下のものが含むように改訂されています。
- Google Base
- Google Blogger
- Google Calendar
- Google Codesearch
- Google Documents List
- Google Notebook
- Google Provisioning
- Google Spreadsheets
- Picasa Web Albums
- YouTube
Zend Framework V1.5 でサポートされる新しい Web サービスの中で、おそらく最も期待されていたものは YouTube API のサポートでしょう。今や Zend_GData を使うことで、非常に多様な条件を使ってその条件に一致する YouTube の動画を検索してアクセスしたり、動画フィードやチャンネル登録を利用したり、ユーザーのプロフィールを調べたり、ある特定ユーザーのすべての動画とお気に入りを見たり、コメントを取得したりすることができます。既存の機能を利用することで、適切な YouTube コンテンツを発見し、それを PHP アプリケーションに完全に統合することができます。
現状では、Zend Framework の YouTube API では読み取りのみがサポートされています。
Ajax サポートの改善: ContextSwitch ヘルパーと REST
Ajax (Asynchronous JavaScript + XML) はクライアントのブラウジング・セッションへの情報の提供方法に大きな影響を与えました。これをもっと簡単に言えば、Ajax を利用することによって、クライアント・サイドの JavaScript はメインのウィンドウから外れてナビゲートしたりリロードしたりすることなく、外部ソースに情報をリクエストして受信することができます。Ajax は Gmail などを始めとする Web アプリケーションで盛んに使われており、Gmail ではウィンドウ全体をリロードせずにかなり頻繁に情報を更新します。
Zend Framework V1.5 では、ContextSwitch ヘルパーと Zend_REST コンポーネントによってネイティブの Ajax サポートが改善されています。
ContextSwitch ヘルパーは Zend_Controller の一部であり、既存のコンテンツを別のフォーマットまたは別のコンテキストで提供するために使われます。例えば、皆さんがこの 3 週間に食べたすべての朝食の詳細を一覧で表示するページを作成するコントローラーを作成してあるとします。通常、このコントローラーは、ブラウザーできちんと表示できる皆さんの Web サイトの他のページと同様のレイアウトとビューにより、ページを表示します。ここで、その同じリストを XML で提供してくれないかと誰かが皆さんに頼んだと考えてください。この場合、ContextSwitch を使うと、別のコントローラーを作成する必要がなくなります。単にこの ContextSwitch ヘルパーに対して、このコントローラーが XML を表示できるように、通常のコンテキスト・ビュー・スクリプトの代わりに XML ビュー・スクリプトを作成して使うよう、指示するのです。ContextSwitch は文書の拡張子が適切でヘッダーもきちんと形成されていることを確認し、そして皆さんの食べたすべての朝食の一覧を Ajax で利用しやすい XML で提供するのです。
今やこれが、さらに簡単になりました。Zend Framework V1.5 には AjaxContext ヘルパーがあり、このヘルパーは、Ajax レスポンスを作成するためにコンテキストを XML に切り替える、という目的のみのために存在しています。
Ajax のサポートは既に拡大されていますが、REST クライアントと完全な REST サーバー機能の両方を含む Zend_REST コンポーネントによって、それがさらに拡大されます。独自の Web サービスを提供するために、あるいは Web サービスを利用したり解析したりするために、Zend_REST を使用することができます。もちろん、皆さんが公開する XML Web サービスには、(ご想像のとおり) Ajax を使って容易にアクセスすることができます。
ここまで見てきたように、Zend Framework V1.5 にはかなりの数の魅力的な新しい機能が追加されました。そうしたなかには、単にルーチン・タスクの適切な設定をするのが以前よりも容易になったということや、自分自身で行うには荷が重すぎるさまざまな選択肢が容易に利用可能になったといったことなどがあります。これらはすべて皆さんにとって強力なツールとなり、それは決して悪いことではないはずです。
学ぶために
- Zend Framework の Programmer's Reference Guide を見てください。
-
Zend Framework の V1.5 の新機能の概要について読んでください。
-
Zend_Layout コンポーネントに関する提案を読んでください。
- 共有 ID サービス、OpenID について読んでください。
- 無料でオープンソースの情報取得ライブラリー、Lucene に関する資料を読んでください。
-
Zend Framework のサイトには、最新のドキュメンテーションとインストールに関する FAQ が用意されています。
- Zend Framework を詳細に説明した、developerWorks の 9 回シリーズの記事「Zend Framework を理解する」を読んでください。
-
PHP Function List は貴重なリソースです。
- PHPPatterns は PHP の観点から MVC を説明しています。
- developerWorks のチュートリアル「Apache Lucene
quick-start guide」を読み、Apache Lucene のサブプロジェクトである Apache Solr V1.2 について学んでください。
- developerWorks の記事「Beef up Web search
applications with Lucene」を読み、堅牢な Web 検索アプリケーションの作成方法を学んでください。
-
PHP.net は PHP 開発者のための中央リソースです。
- 「Recommended PHP reading list」を調べてみてください。
- developerWorks には他にも PHP に関する資料が豊富に用意されています。
- IBM developerWorks の PHP project resources を利用して PHP のスキルを磨いてください。
-
developerWorks podcasts では、ソフトウェア開発者のための興味深いインタビューや議論を聞くことができます。
- PHP でデータベースを使うのであれば、Zend Core for IBM を調べてみてください。これはシームレスでそのまま使用でき、インストールも容易な、IBM DB2 V9 をサポートする PHP の開発環境であり実動環境です。
- developerWorks の Technical events and webcasts で最新情報を入手してください。
- IBM オープンソース開発者にとって関心のある、世界中で今後開催される会議や業界展示会、ウェブキャスト、その他のイベントについて調べてみてください。
- developerWorks の Open source ゾーンをご覧ください。オープンソース技術を使った開発や、IBM 製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
- IBM とオープンソース技術、そして製品機能を調べ、学ぶために、無料の developerWorks On demand demos をご覧ください。
製品や技術を入手するために
-
Zend Technologies から Zend Framework V1.5.1 をダウンロードしてください。
- PHP.net から PHP V5.x をダウンロードしてください。
- 皆さんの次期オープンソース開発プロジェクトを IBM trial software を使って革新してください。ダウンロード、あるいは DVD で入手することができます。
-
IBM 製品の試用版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。
議論するために
-
developerWorks blogs から developerWorks のコミュニティーに加わってください。
- developerWorks の PHP Forum: Developing PHP applications with IBM Information Management products (DB2, IDS) に加わってください。