まずは定番の「Hello world」を表示させてみましょう。
■ 文字を表示させる(ZF無し版)
表示用スクリプト(index.php)
このように、フレームワークのたぐいを使わないでベタに書いた方がごくシンプルに書けてしまいます。
では何のためにフレームワークを使うのでしょうか?
絶対的な答えを出すのは難しいですが、なんかいい感じになるようです。
フレームワーク(枠組み)の名の通り、記述に決まりを作ることで大規模なシステム開発になってもスッキリ整理されたものになり、開発スピードもアップするとかしないとか
まぁそのためには自在に使いこなせるぐらいのレベルにならないといけませんね。(泣)
■ 文字を表示させる(Zend_View使用版)
表示用スクリプト(index.php)
ビュースクリプト(hello.phtml)
ZFは機能ごとにコンポーネントと呼ばれる形(Zend_で始まる)で分かれていて、このうちの表示を担っているものが「Zend_View」というコンポーネントになります。
コンポーネント同士は互いに依存度が低く、機能が独立しているので単独で使うことができます。
このように単独でも使えるし、コンポーネント同士を連携させることもできるのが特徴です。
表示用スクリプトでは、まずrequire_onceを使ってZend_Viewコンポーネントを呼び出しています。
これで次に「new演算子」を使ってインスタンス化することができるわけです。
表示できる文字コードは、デフォルトだとUTF-8になっているようなので他の文字コードを使っている場合にはsetEncoding()メソッドで使用文字コードを指定してやります。
上記のように「Hello world」の場合だとアスキーコードのみなので文字コード指定は不要ですが、この指定を知らないまま日本語を使った場合には文字が表示されなくて混乱するものです。
次にビュースクリプトですが、このビュースクリプトというのは最終的に表示させる画面の虫食い版といったところです。
つまり画面の種類と同じだけビュースクリプトも作成していくことになります。
render()メソッドは、ビュースクリプトを処理した結果(HTMLソース)を表示スクリプト側に返しています。
以上で「index.phpへのリクエスト」→「Zend_Viewを使った処理」→「echoでHTMLソースをレスポンス」の流れが成り立っているわけです。
いよいよ本丸、ウェブアプリ制作の大本命「MVC」に進みます。
ZFのコンポーネント同士は依存性が低いのでZend_Viewだけを使うというようなことが可能ではありますが、あくまでもウェブアプリケーションを作っていく上で主要なものはMVCということになるでしょう。これは他のフレームワークでも同様だと思います。
MVCはModel-View-Controllerからきてるとおり、Modelは処理、Viewは表示、Controllerは制御に分けて互いの処理範囲を明確にすることでスッキリ整理されたアプリケーション開発を実現するものです。(多分)
Viewに関しては先ほど使ったZend_Viewコンポーネントが担当することになります。
ではControllerはZend_Controllerが担当するかというと、実はそのとおりです!
但し、Zend_Modelは存在しないので悪しからず。というのも具体的な処理部分までフレームワーク側で用意してしまうと膨大な量になり自力で書くよりも膨大な量を使いこなすのが大変になるからでしょうね。その代わりにだいたいの決まったアプリケーションのパターンはモジュールとして再利用ができるようにパッケージ化できると思います。
■ いきなりHello worldを表示させてみる
いろんなことは抜きにして、とにかくごくシンプルな表示のみを行うものを書いてみていろいろ考察してみましょう。
▽ フロントコントローラ [htdocs/index.php]
▽ アクションコントローラ [application/controllers/MessageController.php]
▽ ビュースクリプト [application/views/scripts/message/hello.phtml]
▽ htdocs/.htaccess記述例(apacheモジュールmod_rewrite必須)
▽ ディレクトリ構造(各ファイルの配置)
application/ (非公開ディレクトリ)
+- views/ ...ビュー置き場
| +- scripts/
| +- message/
| +- hello.phtml ...ビュースクリプト
+- controllers/ ...(アクション)コントローラ置き場
+- MessageController.php ...アクションコントローラ
htdocs/ (公開ディレクトリ)
+- index.php ...フロントコントローラ
+- .htaccess ...リライト設定用
以上のファイルを作成して配置させた上で下記URLへリクエストをすると、無事あいさつが表示できました。
http://サーバ名/message/hello
(「サーバ名」は環境によって読み換えてください)
で、まずはファイルの配置を見ていきますと特徴的なのは公開されるhtdocsディレクトリにフロントコントローラが一人ぽっちで、他ファイルはすべてapplicationディレクトリ以下に含まれていることです。
これはどういうことかと言うと、index.phpがすべてのリクエストを受けて(リライト機能による)、メインとなる処理はすべてアクションコントローラに丸投げしている、つまりアプリケーション本体はapplicationディレクトリに含まれているので後々モジュールとして切り分けやすい構造ということになります。
各ファイルについて見ていきます。
『フロントコントローラ』では、アプリケーションコントローラの置き場所を教えてるだけです。あとはdispatch()メソッドを書くだけでメインの処理をアクションコントローラにやってもらって、最後にビューにHTML文書をレンダリング(描画)してもらった結果をレスポンスしています。
『アクションコントローラ』は、クラス(設計図)として作成します。つまりこのままでは実体の無い紙切れなので、フロントコントローラに書いたdispatch()メソッド内部で実体化(インスタンス化)してhelloAction()メソッドをコールしています。
アクションメソッドではZend_Viewが実体化された「$this->view」が用意されているのでいきなり使うことができます。
ここで表示させている'Hello world'はアスキーコードのみなので必要ないですが、日本語をUTF-8以外の文字コードで使う場合のためにsetEncoding()メソッドを使います。
『ビュースクリプト』では、アクションコントローラ側で代入された変数値を反映させた上で処理することになります。escape()メソッドはPHPのhtmlspecialchars()関数と同じようなサニタイズです。
このビューのレンダリング処理は、フロントコントローラに書かれたdispatch()メソッド内で最後に実行された上で最終的な表示用のHTML文書を描画した結果をレスポンスしています。
■ コントローラ名やアクション名って何?
で、『コントローラ名』と『アクション名』って何よ って話になるわけなんですが、『アクション名』は処理(理想としては機能ごとに分けられたもの)ごとに付けた名前になります。
つまり『アクション名』には、機能(処理内容)が判るような名前を付けるのがベターだと言えます。
で、『コントローラ名』なんですが、正確には『アクションコントローラ名』と言うべきかも知れません。
複数あるであろうアクション(機能ごとの処理)をまとめた入れ物の名前みたいなものだと思っていいと思います。
例えば掲示板なら、
『コントローラ名』を"bbs"、
『アクション名』を"read"(閲覧)、"write"(書き込み)、"login"(管理者ログイン)、"delete"(書き込み削除)
のような感じでしょうかね。。。
Zend FrameworkでMVC(2010/10/27更新)につづく。。。