アプリケーションコードの作成
ファイルをセットアップする前に、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がコールされます。つまり、http://localhost/zf-tutorial/public/ のようなURLはIndexコントローラのindexアクションが実行されます。
これは簡単なチュートリアルなので、ログインのような複雑なことに気を使うつもりはありません。これについては別のチュートリアルに期待してください(Zend Framework in Action を読むこともできます)。
アルバムに利用するのは4ページですが、4つのアクションを1つのコントローラにまとめます。使用するデフォルトコントローラーと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
これらのコマンドはIndexController内にindexAction, editAction, deleteActionを作成し、後に必要となるビュースクリプトファイルも適切に作成してくれます。これで使いたい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
データベース
コントローラのアクションとビューファイルを用意し、アプリケーションの骨組みができました。次はアプリケーションのモデルについて考えていきます。モデルはアプリケーションの主目的(”ビジネスルール”と呼ばれる)を処理する部分で、このチュートリアルではデータベースを使用します。データベーステーブルから行を検索、挿入、更新、削除するために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のデフォルトアダプタに設定されます。他の利用可能なリソースプラグインについては次のドキュメントを読んでください。: http://framework.zend.com/manual/ja/zend.application.available-resources.html
データベーステーブルの作成
最初の計画通り、アルバムデータの保存にデータベースを使う予定です。私は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
('Paolo Nutine', 'Sunny Side Up'),
('Florence + The Machine', 'Lungs'),
('Massive Attack', 'Heligoland'),
('Andre Rieu', 'Forever Vienna'),
('Sade', 'Soldier of Love');
これでデータベースにデータが格納されました。このデータのための非常に簡単なモデルを書きましょう。
モデル
Zend FrameworkはZend_Modelクラスをビジネスロジックのためには提供していません。どのように動作させるかはあなた次第です。あなたのニーズにあわせて使用できるコンポーネントが数多くあります。アプローチの方法の一つは、アプリケーションに各エンティティを表すモデルクラスを持たせ、マッパーオブジェクトを使ってエンティティをデータベースから読み込んだり保存させるやり方です。このアプローチについては、Zend Framework QuickStartのドキュメントに記載されています。: http://framework.zend.com/manual/ja/learning.quickstart.create-model.html
このチュートリアルでは、Zend_Db_Tableを拡張したモデルとZend_Db_Table_Rowを使用します。Zend Frameworkは、データベーステーブルのデータの仲介をするデザインパターン、テーブルデータゲートウェイパターンを実装したZend_Db_Tableが用意されています。テーブルデータゲートウェイパターンは、大規模システムでの使用は限られることも承知しておきましょう。コントローラーアクションメソッドにデータベースへのアクセスコードを置きたい誘惑もありますが、Zend_Db_Tableにより破棄されます(?)。
抽象クラスであるZend_Db_Table_Abstractの派生クラスにアルバム管理のための詳細を実装します。そのクラスをどのように呼ぶかは問題ではありませんが、データベーステーブルに従うのが理に適っています。我々のプロジェクトは、Zend_Applicationによってインスタンス化されたデフォルトのオートローダーを持ち、そのオートローダーは、通常であればモジュール下にあるリソースクラスを定義されているディレクトリにマップします。application/ フォルダーには Application_ というプレフィックスを使います。
オートローダーは、以下のマッピングでリソースとディレクトリをマップします。
| Prefix | Directory |
|---|---|
| Form | forms |
| Model | models |
| Model_DbTable | models/DbTable |
| Model_Mapper | models/mappers |
| Plugin | plugins |
| Service | services |
| View_Filter | views/filters |
| View_Helper | views/helpers |
データベーステーブルにalbumsと名付けたので、Application_Model_DbTable_AlbumsというZend_Db_Tableを継承したクラスを使います。このファイルは、applications/models/DbTable/Albums.php に配置されます。
Zend_Db_Tableに扱うテーブル名を知らせるため、protectedプロパティの$_nameにテーブル名をセットします。Zend_Db_Tableは、テーブルがデータベースによってオートインクリメントなプライマリーキー idを付与されていることが前提となっています。もし必要ならばこのフィールド名は変更することができます。
同じ作業をするのにzfコマンドラインツールを使うこともできます。コマンドラインで以下を実行してください:
zf create db-table Albums albums
これでコマンドラインツールは、application/models/DbTable フォルダ内にAlbums.phpファイルを作成します。このファイルの中身は、Application_Model_DbTable_Albumsというクラスで、このクラスが通信するデータベースのテーブル名がセットされています。
application/models/DbTable/Albums.php を編集していくつか機能を追加しましょう。getAlbum(), addAlbum(), updateAlbum() そして deleteAlbum() メソッドを追加し、以下のようになります:
zf-tutorial/application/models/DbTable/Albums.php
<?php
class Application_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 チュートリアル その1 - チュートリアルの動作環境,Zend_Tool
- Zend Framework チュートリアル その2 - チュートリアルアプリケーション
- Zend Framework チュートリアル その3 - アプリケーションコードの作成,データベース,モデル
- Zend Framework チュートリアル その4 - レイアウトとビュー
- Zend Framework チュートリアル その5 - アルバムの一覧表示,最後に
