ZF2在渲染模板时想要截断的控制器名称,为什么?

时间:2015-08-21 13:21:33

标签: php zend-framework zend-framework2

我正在创建一个名为Template的ZF2模块。见下文:

enter image description here

在我的module.config.php中,我的视图管理器和控制器配置如下:

return array(
// Telling where the views are
'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',
        'template/my/index' => __DIR__ . '/../view/template/myctrl/index.phtml',
        'error/404'               => __DIR__ . '/../view/error/404.phtml',
        'error/index'             => __DIR__ . '/../view/error/index.phtml',
    ),
    'template_path_stack' => array(
        __DIR__ . '/../view',
    ),
),
// Mapping controller names to controller files
'controllers' => array(
     'invokables' => array(
         'Template\Controller\MyCtrl' => 'Template\Controller\MyController'
     )
 ),     

template_map中,我必须使用template/my/index值而不是template/myctrl/index,否则,我会收到以下错误消息:

Zend\View\Renderer\PhpRenderer::render:
    Unable to render template "template/my/index";
    resolver could not resolve to a file

为什么?

3 个答案:

答案 0 :(得分:1)

所以,这有点令人困惑,因为你在一个名为'template'的模块中渲染视图模板时遇到了麻烦,但是,我不认为这是一个bug。

假设您没有尝试从控制器渲染特定视图,ZF将根据模块名称,控制器名称和操作名称确定要使用的视图。 (我不认为您在控制器invokables中使用的别名是相关的。)对于控制器,它将删除任何名称空间并剥离“Controller”后缀(如果存在)。所以template/my/index就是你留下的。

你没有拥有来使用template_map(它是可选的,可以提高性能),但在你的情况下,因为你的视图文件夹名为myctrl,渲染只能起作用如果您使用模板地图将ZF正在查找的内容映射到实际位置。

我建议您只需将myctrl视图文件夹重命名为my并删除模板映射条目(暂时),然后一切都应该正常工作。

答案 1 :(得分:0)

像@JVestry一样说这看起来像个错误。所以,让我们先尝试别的。

找到您的templatemap_generator.php文件。它应该在您的ZF2/bin文件夹中。导航到您的模块文件夹,例如Application文件夹所在的src, view, config目录。打开终端并键入php ../../vendor/ZF2/bin/templatemap_generator.php ZF将在模块目录中创建模板映射。现在使用此模板,只需修改module.config.php文件

即可
return array(
// Telling where the views are
'view_manager' => array(
    'display_not_found_reason' => true,
    'display_exceptions'       => true,
    'doctype'                  => 'HTML5',
    'not_found_template'       => 'error/404',
    'exception_template'       => 'error/index',
    'template_map' => include __DIR__ . '/../template_map.php',
),
// Mapping controller names to controller files
'controllers' => array(
     'invokables' => array(
         'Template\Controller\MyCtrl' => 'Template\Controller\MyController'
     )
 ),

myAction()

$view = new ViewModel();
$view->setTemplate("template/myctrl/index");

我打电话给template/my/index,因为这是生成器将要生成的内容,但您可以随意重命名为任意内容。

答案 2 :(得分:0)

您可以使用controller_map更精细地控制渲染模板的名称。

所以在你的情况下你可能会这样做:

return array(
// Telling where the views are
'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',
        'template/my/index' => __DIR__ . '/../view/template/myctrl/index.phtml',
        'error/404'               => __DIR__ . '/../view/error/404.phtml',
        'error/index'             => __DIR__ . '/../view/error/index.phtml',
    ),
    'template_path_stack' => array(
        __DIR__ . '/../view',
    ),
    'controller_map' => array(
        'Template\Controller\MyCtrl' => 'template/myctrl',
    ),
),
// Mapping controller names to controller files
'controllers' => array(
     'invokables' => array(
         'Template\Controller\MyCtrl' => 'Template\Controller\MyController'
     )
),

请参阅:https://github.com/zendframework/zf2/pull/5670