早速ですが、
何事をはじめるにも最初は簡単なことからはじめるのが一番です。ゲストブックと呼ばれるアプリケーションを作ってみましょう。
ゲストブックとは
旅館やペンションにて、
ゲストブックは設計が非常にシンプルなのでコンピュータアプリケーションの入門アプリとして広く利用されています。この連載でも最初のアプリケーションはゲストブックにします。
フレームワークなしのゲストブックアプリ
Zend Frameworkを利用したゲストブックアプリケーションを期待されているかもしれませんが、
ゲストブックの仕様
どんなアプリケーションでも仕様が必要です。今回作るゲストブックは以下の仕様をみたすものとします。
- ゲストブックは誰でも記入できる
- タイトル、
メッセージ、 記入日時を記録する - 一覧が参照できる
- セキュリティは特に考慮しない
- エラー処理は考慮しない
- 可能な限り実装を簡略化する
はじめてのZend Frameworkアプリケーションの元となるPHPアプリケーションは、
通常このような実装での公開は大いに問題がありますが、
ゲストブックアプリファイルの配置
ファイルは/www/
自分ですべてのファイルやディレクトリを作成することも可能です。Zend Frameworkは特定のファイルレイアウトを想定していないので、
Zend Toolで作成済みのsample applicationディレクトリを/www/
mkdir /www/guestbook cd /www/guestbook zf project create
前回の解説通りPostgreSQLバイナリ版をインストールしているのであれば、
cd /www ln -s guestbook default
この状態でZend Frameworkの空アプリケーションが動作するか確かめておきましょう。
Hello from the index view script.
と表示されれば正しく動作しています。
ゲストブックデータベースの作成
データベースを作成するスクリプトは用意していないのでコマンドで作成します。データベース作成用のSQLコマンドファイルは次の通りです。
CREATE TABLE guestbook (id SERIAL PRIMARY KEY, title TEXT, content TEXT, date_created TIMESTAMP);
どこでもよいのでguestbook.
/opt/PostgreSQL/8.3/bin/createdb -U postgres guestbook /opt/PostgreSQL/8.3/bin/psql -U postgres -f guestbook.sql guestbook
これでデータベースが作成できました。
備考:この方法ではPostgreSQLのスーパーユーザであるpostgresアカウントに所有されたデータベースが作成されます。運用時にはスーパーユーザをサービスに利用することは好ましくありません。
通常版ゲストブックアプリ
通常版のゲストブックアプリはDocumentRootに配置するだけです



<?php
include 'list/index.php';
このファイルはゲストブックの一覧を表示するスクリプトを呼び出しすだけのスクリプトです。
<?php
// ゲストブックデータベースを開く
$db = new PDO('pgsql:host=localhost dbname=guestbook user=postgres password=postgresql');
// すべてのエントリを取得
$stmt = $db->prepare('SELECT * FROM guestbook ORDER BY id DESC');
$stmt->execute();
$rows = $stmt->fetchAll();
// データベースオブジェクトを削除
$db = null;
?>
<html>
<head>
<title>ゲストブック - 一覧</title>
</head>
<body>
<p><a href="../post/">ゲストブックに記入する</a></p>
<?php if (empty($rows)): ?>
<p>ゲストブックが空です。</p>
<?php else: ?>
<table>
<?php foreach ($rows as $row): ?>
<tr><td>
日時: <?php echo htmlentities($row['date_created']) ?><br />
件名:<?php echo htmlentities($row['title']) ?> <br />
メッセージ: <?php echo htmlentities($row['content']) ?><br />
</td>
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?>
</body>
</html>
このファイルはシンプルなPHPアプリケーションによくある、
<?php
try
{
// ゲストブックデータベースを開く
$db = new PDO('pgsql:host=localhost dbname=guestbook user=postgres password=postgresql');
empty($_POST) ? define('POST',false) : define('POST', true);
// フォームが送信されている
if (POST) {
// データベースに保存
$db->query("INSERT INTO guestbook (title, content, date_created) VALUES (".$db->quote($_POST['title']).", ".$db->quote($_POST['content']).", ".$db->quote(date('Y-m-d H:i:s')).")");
}
} catch (PDOException $e) {
// データベースにアクセスできない
die('DBサーバへアクセス可能か確認してください');
}
?>
<?php if (!POST): ?>
<html>
<head>
<title>ゲストブック - 書き込み</title>
</head>
<body>
<div>
<form id="guestbook" action="<?php echo $_SERVER['PHP_SELF'] ?>" method="post">
<div>
件名: <input type="text" name="title" id="title" /><br />
</div>
<div>
メッセージ:<textarea name="content" id="content"></textarea><br />
</div>
<div>
<input type="submit" name="送信" id="submit_btn" />
</body>
</html>
<?php else: ?>
<html>
<head>
<title>ゲストブック - 書き込み</title>
</head>
<body>
<div><p><a href="../list/">一覧に戻る</a></p></div>
<div>
件名: <?php echo htmlentities($_POST['title']) ?><br />
</div>
<div>
メッセージ:<?php echo htmlentities($_POST['content']) ?><br />
</div>
</body>
</html>
<?php endif; ?>
このスクリプトはデータベースを開き、
このアプリケーションを見て
その前に、
Zend Framework版のゲストブックアプリ
通常版アプリケーションをできる限りそのままに、
Zend Frameworkアプリケーションと通常のアプリケーションは共存できるので、
Zend Toolのzfコマンドによって、
必要なファイルは、

まずはエラー処理
1.
幸い簡単なコード追加でエラーを表示させることができます。簡単なエラー処理を行うにはerrorコントローラクラスにerrorアクションを追加し、
/www/
public function errorAction()
{
}
このerrorアクション用のビューを作ります。
<html>
<head><title>Error</title></head>
<body>
<h1>An error occurred</h1>
<h2><?php echo $this->message ?></h2>
<?php if ('development' == $this->env): ?>
<h3>Exception information:</h3>
<p>
<b>Message:</b> <?php echo $this->exception->getMessage() ?>
</p>
<h3>Stack trace:</h3>
<pre><?php echo $this->exception->getTraceAsString() ?></pre>
<h3>Request Parameters:</h3>
<pre><?php var_dump($this->request->getParams()) ?></pre>
<?php endif ?>
</body>
</html>
このビューを追加すると、
<?php if ('development' == $this->env): ?>
から、
これで例外エラーは表示されるようになりますが、
本連載のインストールでのphp.
- /opt/
PostgreSQL/ EnterpriseDB-ApachePhp/ php/ php. ini
php.

エラー処理用のビューを追加すると、

この図は、
これで随分、
ListとPostコントローラ/ビュースクリプトの作成
次にゲストブックアプリケーションの中身であるListとPostのコントローラとビュースクリプトを作ります。
まずはListコントローラから作りましょう。Zend Frameworkの機能についても一つづつ紹介します。
ZendFrameworkはあまり規約を設定に利用していないフレームワークですが、
コントローラスクリプトはコントローラディレクトリ
- [コントローラ名]Controller.
php
でなければなりません。コントローラファイルはコントローラクラスを定義する必要があります。クラス名は
- [コントローラ名]Controller
でなければなりません。コントローラクラスにはそのコントローラがサポートするアクションをメソッドとして定義しなければなりません。アクションメソッド名は
- [アクション名]Action
でなければなりません。デフォルトでは
- http://
hostname/[コントローラ名]/[アクション名]/
とリクエストされた場合、
Zend Frameworkのコントローラについてほかにも知るべきことはありますが、
<?php
class ListController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
$this->db = Zend_Db::factory('Pdo_Pgsql', array(
'host' => 'localhost',
'username' => 'postgres',
'password' => 'postgresql',
'dbname' => 'guestbook'
));
}
public function indexAction()
{
/* Default action for action controller */
$this->_forward('List');
}
public function listAction()
{
$sql = "SELECT * FROM guestbook ORDER BY id DESC";
$rows = $this->db->fetchAll($sql);
$this->view->rows = $rows;
}
}
initメソッドはコントローラオブジェクトが作成される場合に自動的に実行させるメソッドです。initメソッドの
$this->db = Zend_Db::factory('Pdo_Pgsql', array(
'host' => 'localhost',
'username' => 'postgres',
'password' => 'postgresql',
'dbname' => 'guestbook'
));
でZend_
indexActionが呼ばれたとき、
- http://
localhost/ list/
とリクエストされた時には、
このアプリケーションではindexActionには特にすることがないのでlistActionに処理を渡すことにしています。そのために
$this->_forword('List');
を実行してlistActionに処理を渡しています。結果として、
- http://
localhost/ list/ - http://
localhost/ list/ list/
とアクセスしても同じ結果になります。indexActionに特定の機能を持たせたくない場合や、
次にビュースクリプトの解説をしますが、
listアクションでは
$sql = "SELECT * FROM guestbook ORDER BY id DESC";
$rows = $this->db->fetchAll($sql);
$this->view->rows = $rows;
で、
この状態で一度このコントローラにアクセスしてみましょう。

Message: script 'list/
と、
ビュースクリプトの名前から分かるように、
ビュースクリプトを作る
早速ビュースクリプトを作ってみましょう。ビュースクリプトは
- /www/
guestbook/ application/ views/ scripts
ディレクトリに中に、
Listkコントローラのlistアクションのビュースクリプトの場所と名前は次のようになります。
- /www/
guestbook/ application/ views/ scripts/ list/ list. phtml
<html>
<head>
<title>ゲストブック - 一覧</title>
</head>
<body>
<p><a href="../post/">ゲストブックに記入する</a></p>
<?php if (empty($this->rows)): ?>
<p>ゲストブックが空です。</p>
<?php else: ?>
<table>
<?php foreach ($this->rows as $row): ?>
<tr>
<td>
日時: <?php echo htmlentities($row['date_created']) ?><br />
件名:<?php echo htmlentities($row['title']) ?> <br />
メッセージ: <?php echo htmlentities($row['content']) ?><br />
</td>
</tr>
<?php endforeach; ?>
</table>
<?php endif; ?>
</body>
</html>
$thisとはviewオブジェクトのことです。listコントローラのlistアクションで
$this->view->rows = $rows;
として代入された$rowsが$this->rowsとして利用できます。
ビューを定義後にアクセスすると次のようなページが表示されます。

Postコントローラとビュー
Postコントローラとビューについては、
<?php
class PostController extends Zend_Controller_Action
{
public function init()
{
/* Initialize action controller here */
$this->db = Zend_Db::factory('Pdo_Pgsql', array(
'host' => 'localhost',
'username' => 'postgres',
'password' => 'postgresql',
'dbname' => 'guestbook'
));
date_default_timezone_set('Asia/Tokyo');
}
public function indexAction()
{
/* Default action for action controller */
$this->_forward('post');
}
public function postAction()
{
if (!$this->getRequest()->isPost()) {
$this->_forward('edit');
} else {
$date = date('Y-m-d H:i:s');
$db = $this->db;
// データを保存する
$sql = "INSERT INTO guestbook (title, content, date_created) VALUES (".$db->quote($_POST['title']).", ".$db->quote($_POST['content']).", ".$db->quote($date).");";
$db->query($sql);
}
}
public function editAction()
{
}
}
目に付くのはdate_
PHP 5.
このコントローラはフォームから送信されたデータを受信するので、
if (!$this->getRequest()->isPost()) {
$this->_forward('edit');
} else {
フォームが送信されていない場合は、
フォームがポストされた場合は、
<html>
<head>
<title>ゲストブック - 書き込み</title>
</head>
<body>
<div>
<form id="guestbook" action="<?php echo $this->url() ?>" method="post">
<div>
件名: <input type="text" name="title" id="title" /><br />
</div>
<div>
メッセージ:<textarea name="content" id="content"></textarea><br />
</div>
<div>
<input type="submit" name="送信" id="submit_btn" />
</body>
</html>
edit.
<html>
<head>
<title>ゲストブック - 書き込み</title>
</head>
<body>
<div><p><a href="<?php echo $this->url(array('controller'=>'list')) ?>">一覧に戻る</a></p></div>
<div>
件名: <?php echo htmlentities($_POST['title']) ?><br />
</div>
<div>
メッセージ:<?php echo htmlentities($_POST['content']) ?><br />
</div>
</body>
</html>
post.
<div><p><a href="<?php echo $this->url(array('controller'=>'list')) ?>">一覧に戻る</a></p></div>
これは
<div><p><a href="/list/">一覧に戻る</a></p></div>
と書いてしまったほうが短くて分かりやすいのですが、
まとめ
どうでしょうか? はじめてのZend Frameworkアプリケーションは動きましたか? まだまだ、
最終的には本格的なブログアプリケーションを作ることに挑戦しますが、