Zend_Layout を使ってみる

最近 Zend FrameworkPHPMVCウェブアプリケーションフレームワーク)の勉強をしています。バージョン 1.5 から Zend_Layout というモジュールが使えるようになったので、試しに使ってみました。

とりあえずドキュメントにしたがってアプリケーションの雛形を作成します。

http://framework.zend.com/manual/ja/zend.controller.html#zend.controller.quickstart

application/
    controllers/
        IndexController.php
        ErrorController.php
    views/
        scripts/
            footer.html
            header.html
            layout.html
            index/
                index.phtml
            error/
                error.phtml
html/
    .htaccess
    index.php

html/.htaccess

Zend FrameworkApachemod_rewrite 機能を使います。mod_rewrite が無効になっているなら、有効にしてください。

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css)$ index.php

html/index.php

すべてのリクエストを受け付けるフロントコントローラです。

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

// レイアウト有効化
Zend_Layout::startMvc();

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

application/controllers/IndexController.php

デフォルトのコントローラです。クラス名が指定されなかったときは、このコントローラの indexAction が呼ばれます。

<?php
class IndexController extends Zend_Controller_Action {
    public function indexAction() {
    }
}

application/controllers/ErrorController.php

エラー時に呼ばれるコントローラです。指定したクラスやメソッドが存在しないときなどにこのコントローラの errorAction が呼ばれます。

<?php
class ErrorController extends Zend_Controller_Action {
    public function errorAction() {
    }
}

application/views/scripts/header.phtml

サイトのヘッダー部分です。

<html>
<body>

application/views/scripts/footer.phtml

サイトのフッター部分です。

</body>
</html>

application/views/scripts/layout.phtml

サイト全体を表示するテンプレートです。

<?= $this->render('header.phtml') ?>
<?= $this->layout()->content ?>
<?= $this->render('footer.phtml') ?>

application/views/scripts/index/index.phtml

IndexController 用のテンプレートです。

ほげほげ

application/views/scripts/error/error.phtml

ErrorController 用のテンプレートです。

エラー

Zend_Layout::startMvc(); を呼ぶと、すべてのアクションのあとで、layout.phtml を使ってレンダリングがされるようになります。各アクション固有のテンプレートのレンダリング結果は $this->layout()->content に入っています。

もし、Zend_Layout を使いたくない場合は、そのアクション内で $this->_helper->layout->disableLayout(); を呼べばよいようです。