Zend Framework でモデルを使う

Zend Framework ではモデルの使用はオプションになっていますが、O/Rマッパー自体は用意されているので、それを使ってみます。今回は test_db というデータベースに test_table_name(主キーは test_primary_key)というテーブルがある前提にします。アプリケーションの構造は推奨にのっとって以下のようにします。

test/html/index.php
test/application/models/Dao/Test.php
test/application/views/scripts/index/index.phtml
test/application/controllers/IndexController.php

test/html/index.php

models 以下にはパスが通っていないので、パスに追加します。Zend Framework のパスは既に php.ini に定義済みであることを前提にします(未定義なら Zend Framework のパスも追加しておきます)。

<?php
function main() {
    // モデルにパスを通す
    set_include_path(
        get_include_path() . 
        PATH_SEPARATOR . '../application/models'
    );

    // オートローダー有効化
    require_once 'Zend/Loader.php';
    Zend_Loader::registerAutoload();

    // データベースハンドルの取得
    $db = new Zend_Db_Adapter_Pdo_Pgsql(Array(
        'host'     => '127.0.0.1',
        'username' => 'anonymous',
        'password' => 'xxxxxxxx',
        'dbname'   => 'test_db'
    ));
    Zend_Db_Table_Abstract::setDefaultAdapter($db);

    // アプリケーション実行
    Zend_Controller_Front::run('../application/controllers');
}
main();

Zend_Db_Table_Abstract::setDefaultAdapter を呼んでおくと、すべてのモデルがデフォルトのデータベースハンドルを使ってくれるようになります。Zend_Db_Adapter_Pdo_Pgsql は PostgreSQL 用のクラスなので、他のデータベースを用いるときはそれに準じたクラスを呼びます。

test/application/models/Dao/Test.php

DAO クラスです。Zend Framework のコーディング規約にのっとって、パスをアンダーバーにしています。モデルは Zend_Db_Table_Abstract を継承します。必須パラメータはテーブル名と主キー名だけです。あとは O/R マッパーがうまいことやってくれます。

<?php
class Dao_Test extends Zend_Db_Table_Abstract {
    protected $_name    = 'test_table_name';
    protected $_primary = 'test_primary_key';
}

test/application/controllers/IndexController.php

test_table_name から全件取り出す例です。詳しい使い方は Zend Framework のドキュメントを参照してください。

<?php
class IndexController extends Zend_Controller_Action {
    public function indexAction() {
        $test = new Dao_Test();
        $rows = $test->fetchAll();
        $this->view->assign('tests', $rows);
    }
}