ZendFramework起動方法を考える

By shin - 09/09/04 - このエントリをはてなブックマークに追加このエントリをYahoo!ブックマークに追加このエントリをdel.icio.usに追加このエントリをFC2ブックマークに追加

ZendFrameworkもリリースから随分たちますので、随分と機能追加や改良が進んでいます。有用なコンポーネントが多数導入され、それらを自由に利用できるのはとても魅力的です。反面、自由度が高いために設計、実装によって大きな差が出やすいフレームワークだとも言えます。

 

機能に関しては充実したマニュアルがありますので、今回は利用方法の部分、中でも起動方法で改善できる部分を取り上げてみます。

 

rewrite ルールについて

初期のころの拡張子によって振り分ける記述から、ファイルの有無によってrewriteさせる方法に移っています。拡張子を指定するよりも信頼度が高く、必要があればZFのコントローラーを使用しないページも共存出来るため、より良い方法だと思います。

 

[Zend Framework: Documentation]
http://framework.zend.com/manual/ja/zend.controller.html#zend.controller.quickstart.go.rewrite

 

起動方法について

公開領域にあり、システム情報が流出する恐れや、オブジェクト指向の原則である情報のカプセル化を妨げていた、これまでのindex.phpで設定しディスパッチする起動方法に対しては、下記の様な改善方法が提案されています。

 

[Official ZF QuickStart Draft]
http://framework.zend.com/wiki/display/ZFDEV/Official+ZF+QuickStart+Draft

 

[起動ファイルのコードのスコープ]
http://tdiary.ishinao.net/20070606.html#p01

 

[ZendFrameworkのindexにあるグローバルな奴らを考える]
http://blog.wozozo.org/archives/95

 

まとめ

私が開発する際は、上記の様なことを踏まえて現在は下記の様にしている事が多いです。Bootstrapという静的な関数のみのクラスを作成し環境判別や必要な処理を関数にして実行させています。index.phpに直接記述するよりも見通しも良くなったかなと思います。他にももっと良く出来るところがあれば指摘して頂けると有難いです。

 

■ファイル配置


/application/modules/
/application/modules/default/controllers/
/application/modules/default/models/
/application/modules/default/views/
/application/Bootstrap.php
/htdocs/index.php

■/htdocs/index.php


include '../application/Bootstrap.php';
Bootstrap::run();

■/application/Bootstrap.php


class Bootstrap
{
    /**
     * 環境判別 [本番=true]
     * 
     * @var boolean
     */
    private static $_isProduct = false;
    
    /**
     * 本番のパス
     * 
     * @var string
     */
    private static $_product   = '/path/to/app';
    
    /**
     * 起動時のパス
     * 
     * @var string
     */
    private static $_baseDir   = '';

    /**
     * 実行
     * 
     * @return void
     */
    public static function run()
    {
        // 環境判別
        self::$_baseDir   = realpath(dirname(__FILE__).'/../../');
        self::$_isProduct = (self::$_baseDir === self::$_product);
        
        // 設定ファイル読み込み
        $confFile = (self::$_isProduct) ? 'product.php' : 'staging.php';
        include self::$_baseDir.'/config/'. $confFile;
        
        // 必要な処理
    }
}