Zend_Layout を試してみる

昨日からハマっている Zend_Layout を今日もいじってみる。


Smarty を使って表示するのが目標だけど、エラーが出て進めない。
いきなり Smarty じゃなくてデフォルトの Zend_View でまずは試してみる。

昨日書いたコードがこれ。layout.phtml が無いってエラーが発生した。

<?php
        $layoutPath = 'path/to/layout';
        $layoutName = 'default';
        $contentKey = 'CONTENTS';
        require_once 'Zend/Layout.php';
        Zend_Layout::startMvc();
        $layout = new Zend_Layout();
        $layout->setLayout($layoutName)
            ->setLayoutPath($layoutPath)
            ->setContentKey($contentKey)
            ->setView($view)
            ->setViewSuffix($viewSuffix);

Zend_Layout のソースを少し追いかけてみた。

<?php
    public function __construct($options = null, $initMvc = false)
    {
        if (null !== $options) {
            if (is_string($options)) {
                $this->setLayoutPath($options);
            } elseif (is_array($options)) {
                $this->setOptions($options);
            } elseif ($options instanceof Zend_Config) {
                $this->setConfig($options);
            } else {
                require_once 'Zend/Layout/Exception.php';
                throw new Zend_Layout_Exception('Invalid option provided to constructor');  
            }
        }

        $this->_initVarContainer();

        if ($initMvc) {
            $this->_setMvcEnabled(true);
            $this->_initMvc();
        } else {
            $this->_setMvcEnabled(false);
        }
    }

    public static function startMvc($options = null)
    {   
        if (null === self::$_mvcInstance) {
            self::$_mvcInstance = new self($options, true);
        } else {
            self::$_mvcInstance->setOptions($options);
        }

        return self::$_mvcInstance;
    }

new Zend_Layout() でインスタンスを生成する場合、第二引数に true を指定する必要があるやん orz
ドキュメントには、第二引数について書かれてない。

例 19.1. オプションをコンストラクタあるいは startMvc() で渡す

コンストラクタおよび静的メソッド startMvc() は、どちらもオプションの配列か Zend_Config オブジェクトを受け取ることができます。 受け取った内容をもとに Zend_Layout インスタンスの設定を行います。

まず、配列を渡す方法を見てみましょう。

<?php
// コンストラクタを使用します
$layout = new Zend_Layout($options);

// startMvc() を使用します
$layout = Zend_Layout::startMvc($options);
?>
http://framework.zend.com/manual/ja/zend.layout.options.html

というわけで、以下の様にすると、Layout が表示された。

<?php
        $layoutPath = 'path/to/layout';
        $layoutName = 'default';
        $contentKey = 'CONTENTS';
        require_once 'Zend/Layout.php';
        $layout = Zend_Layout::startMvc($options);
        // new で生成する場合は第二引数を設定する必要がある
        // $layout = new Zend_Layout($options, true);

ちゃんとドキュメントにも第二引数の事書いて欲しい・・・。


それにしても・・ setMvcEnabled() というメソッドは何故ないんだろう。
_setMvcEnabled() は protected だから外からアクセスできない。
getMvcEnabled() っていう公開メソッドはあるのに・・・。
これがあれば、

<?php
$layout = Zend_Layout($option)
$layout->setMvcEnabled(true);

って書けるのに。


※ 2008/01/31 追記
ドキュメントに Zend_Layout($option); の第二引数については
英文ドキュメントにそもそも書かれていない。