Zend Framework チュートリアル その3 – アプリケーションの具体的なコード,コントローラのセットアップ,データベース,モデル
アプリケーションの具体的なコード
ファイルをセットアップする前に、Zend Frameworkが編成されたページをどのようにして要求するかを理解することが重要です。アプリケーションの各ページはアクションと呼ばれていて、アクションはコントローラ内でグループ化されています。
URLのフォーマットが http://localhost/public/zf-tutorial/news/view の場合はコントローラーはNewsでアクションはviewです。コントローラにより関連するアクションをグループ化することが出来ます。例えば、Newsコントローラーはlist,archived,viewのアクションを持つでしょう。Zend FrameworkのMVCシステムはコントローラをグループ化したモジュールもサポートしています。
でも、このアプリケーションはこれらのことを心配しなければならないほど大きくありません。
デフォルトでは、Zend Frameworkのコントローラはデフォルトのアクションとしてindexという特別なアクションが割り当てられています。
http://localhost/zf-tutorial/public/news/ のような場合ではNewsコントローラのindexアクションが実行されます。 コントローラーの名前も空だった場合のデフォルトも用意されています。何ら驚くことはない、indexがコールされます。つまり、このURL http://localhost/zf-tutorial/public/ はIndexコントローラのindexアクションが実行されます。
これは簡単なチュートリアルなので、ログインのような複雑なことに気を使うつもりはありません!別のチュートリアルに期待してください(Zend Framework in Action で読むこともできます!)。
アルバムに利用するのは4ページですが、4つのアクションを一つのコントローラにまとめます。使用するデフォルトコントローラーと4つのアクションは以下です。
| Page | Controller | Action |
|---|---|---|
| Home page | Index | index |
| Add new album | Index | add |
| Edit album | Index | edit |
| Delete album | Index | delete |
サイトがもっと複雑になってきたり、追加のコントローラが必要になったら、必要であればモジュールとしてコントローラをまとめることもできます。
コントローラのセットアップ
コントローラのセットアップをする準備ができました。Zend Frameworkではコントローラは{Controller name}Controller というクラスでなければいけません。{Controller name}は大文字で開始しなければいけないことに注意してください。このクラスは application/controllers ディレクトリ内の{Controller name}Controller.php というファイルである必要があります。コントローラクラスの各アクションは public function とし、{action name}Action とつける必要があります。{action name}の場合、小文字で開始して最後まで小文字を使います。コントローラとアクションに大文字小文字を混在させることも出来ますが、特別なルールがあるため使用する前に理解しなければいけません。最初にドキュメントを読みましょう。
コントローラクラスはIndexControllerというクラスで、application/controllers/IndexController.php で定義されています。このクラスはZend_Toolで自動的に作成されたものです。我々はアクションを追加していくだけです。
コントローラにアクションを追加するにはzf コマンドラインツールを使います。ターミナル・コマンドプロンプトを開いて、zf-tutorial/ ディレクトリに移動します。それから以下の3つのコマンドをタイプします。
zf create action add index zf create action edit index zf create action delete index
これらのコマンドはxxxAction関数をIndexController内に作成し、後で必要になる適切なビュースクリプトファイルも作成してくれます。これで使いたい4つのアクションの用意ができました。
各アクションのURLは次のようになります。
| URL | Action method |
|---|---|
| http://localhost/zf-tutorial/public/ | IndexController::indexAction() |
| http://localhost/zf-tutorial/public/index/add | IndexController::addAction() |
| http://localhost/zf-tutorial/public/index/edit | IndexController::editAction() |
| http://localhost/zf-tutorial/public/index/delete | IndexController::deleteAction() |
これらのアクションをテストすると次のようなメッセージが表示されます。
View script for controller index and script/action name add
次はデータベースについて考えていきます。
データベース
コントローラのアクションとビューファイルを用意し、アプリケーションの骨組みができました。次はアプリケーションのモデルについて考えていきます。 モデルはアプリケーションの主目的(”ビジネスルール”と呼ばれる)を処理する部分であることを忘れないように。このチュートリアルのケースではデータベースを取り扱います。 データベーステーブルから行をfind, insert, update, deleteするためにZend FrameworkのZend_Db_Tableクラスを使います。
データベースの設定
Zend_Db_Tableを使うためにユーザ名、パスワードと共にどのデータベースを使用するかを知らせる必要があります。この情報をアプリケーションにハードコードはしたくないので、設定ファイルに情報を保存します。Zend_Applicationコンポーネントはデータベース設定リソースを搭載しているので、我々が行うことはconfigs/application.iniファイルに適切な情報を設定して、一息付くだけです。
configs/application.ini を開き、[production]セクション(すなわち[staging]セクションの上)の最後に以下の内容を追加します。
resources.db.adapter = PDO_MYSQL resources.db.params.host = localhost resources.db.params.username = rob resources.db.params.password = 123456 resources.db.params.dbname = zf-tutorial
言うまでもないが、あなたのユーザ名、パスワード、データベース名を使いましょう、私のではなく!これでデータベースへの接続が用意され、Zend_Db_Tableのデフォルトアダプタに設定されます。
データベーステーブルの作成
私はMySQLを使うつもりなので、テーブルを作成するSQLステートメントは次のようになる。
CREATE TABLE albums ( id int(11) NOT NULL AUTO_INCREMENT, artist varchar(100) NOT NULL, title varchar(100) NOT NULL, PRIMARY KEY (id) );
phpMyAdminのようなMySQLクライアントかMySQLコマンドラインクライアントでこのステートメントを実行します。
テストアルバムを挿入
テーブルにいくつか行を追加して、ホームページの検索機能を見てみましょう。まずはAmazon UKから”トップセラー”のCDをいくつか選び、MySQLクライアントで以下のステートメントを実行します。
INSERT INTO albums (artist, title) VALUES ('Bob Dylan', 'Together Through Life'), ('Various Artists', 'Now That\'s what I Call Music! 72'), ('Lady Gaga', 'The Fame'), ('Lily Allen', 'It\'s Not Me, It\'s You'), ('Kings of Leon', 'Only By The Night');
これでデータベースにデータが格納されました。このデータのための非常に簡単なモデルを書きましょう。
モデル
Zend Frameworkはデータベーステーブル内のデータの仲介をするデザインパターン、テーブルデータゲートウェイパターンを実装したZend_Db_Tableが用意されています。もっと複雑なプロジェクトでは、protectedなメンバー変数を使って一つかそれ以上のZend_Db_Tableインスタンスを使うモデルクラスを作るほうが通常は価値があります。しかしながら、このチュートリアルではZend_Db_Tableを継承したモデルを作成します。
Zend_Db_Tableは抽象クラスです。そのため、派生クラスにアルバム管理のための詳細を実装しなければなりません。クラスをどのように呼ぶかは問題ではありませんが、データベーステーブルの後にクラス名をつけるのが理に適っています。プレフィックスを含めると、テーブル名が albums のクラス名は Model_DbTable_Albums となるでしょう。Zend_Db_Table に管理するテーブル名を知らせるには、protectedプロパティの$_nameにテーブル名を設定します。Zend_Db_Tableはテーブルがデータベースによるオートインクリメントなプライマリーキー idを持っていることを前提としています。もし必要ならばこのフィールド名は変更することができます。
Albumsクラスはapplications/models/DbTable ディレクトリのAlbums.phpファイルに納めます。ファイルを作成して、以下のコードを入力してください。
zf-tutorial/application/models/DbTable/Albums.php
<?php class Model_DbTable_Albums extends Zend_Db_Table_Abstract { protected $_name = 'albums'; public function getAlbum($id) { $id = (int)$id; $row = $this->fetchRow('id = ' . $id); if (!$row) { throw new Exception("Count not find row $id"); } return $row->toArray(); } public function addAlbum($artist, $title) { $data = array( 'artist' => $artist, 'title' => $title, ); $this->insert($data); } public function updateAlbum($id, $artist, $title) { $data = array( 'artist' => $artist, 'title' => $title, ); $this->update($data, 'id = '. (int)$id); } public function deleteAlbum($id) { $this->delete('id =' . (int)$id); } }
アプリケーションがデータベースのインターフェースとして使用するヘルパーメソッドを4つ作成しました。getAlbum()は配列として1行取得します。addAlbum()はデータベースに新しい行を追加します。updateAlbum()はアルバムを更新し、deleteAlbum()は行を完全に削除します。
これらのメソッドの各コードは一目瞭然です。このチュートリアルでは必要ありませんが、関連するテーブルをZend_Db_Tableに知らせることや、関連するデータを取って来ることもできます。
コントローラ内でモデルからデータを取得して、それを表示するためにビュースクリプトを取得する必要があります。でもその前に、Zend Frameworkのビューシステムがどのように動いているか理解する必要があります。
次のページ:: Zend Framework チュートリアル その4 – レイアウトとビュー
目次
- Zend Framework チュートリアル - Getting Started with Zend Framework
- Zend Framework チュートリアル その1 - 要件,チュートリアルの条件,フレームワークの取得,Zend_Tool
- Zend Framework チュートリアル その2 - アプリケーションの作成開始
- Zend Framework チュートリアル その3 - アプリケーションの具体的なコード,コントローラのセットアップ,データベース,モデル
- Zend Framework チュートリアル その4 - レイアウトとビュー
- Zend Framework チュートリアル その5 - アルバムの一覧表示,新規追加,編集,削除,最後に