0

在与 ZF2 一起使用的基本示例应用程序中,IndexController 的编码如下:

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;
use Zend\View\Model\ViewModel;

class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        return new ViewModel();
    }
}

只有一个简单的 return 语句,其内容index.phtml会自动包含在输出中。

我看到index.phtml引用的唯一地方是\module\Application\config\module.config.php

'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),

我试过评论这条线:

//'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',

但是 index.phtml 仍然包含在输出中。

那么问题来了,为什么要包括在内?幕后发生了什么神奇的事情,使它仍然被包括在内?

在我看来,也许我错过了一些由 ZF2 处理的基本自动映射,我无法在文档中找到这些映射。但是如果有一些自动映射,为什么那条线存在于module.config.php?

4

1 回答 1

1

所以事实证明存在冗余module.config.php

'view_manager' => array(
        'display_not_found_reason' => true,
        'display_exceptions'       => true,
        'doctype'                  => 'HTML5',
        'not_found_template'       => 'error/404',
        'exception_template'       => 'error/index',
        'template_map' => array(
            'layout/layout'           => __DIR__ . '/../view/layout/layout.phtml',
            'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',
            'error/404'               => __DIR__ . '/../view/error/404.phtml',
            'error/index'             => __DIR__ . '/../view/error/index.phtml',
        ),
        'template_path_stack' => array(
            __DIR__ . '/../view',
        ),
    ),

此行是静态映射:

'application/index/index' => __DIR__ . '/../view/application/index/index.phtml',

这些行是动态映射:

'template_path_stack' => array(
    __DIR__ . '/../view',
),

这个页面上的使用部分让我很清楚。 http://framework.zend.com/manual/2.0/en/modules/zend.view.quick-start.html

它尽可能使用静态映射来提高性能,然后故障转移到动态映射。注释掉这两个实际上会导致错误,ViewModel() 找不到要包含的页面。

Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "application/index/index"; resolver could not resolve to a file'

于 2013-01-14T17:13:58.687 回答