Zend 3 - 更改模板基本路径

Zend 3 - Change template basepath

我刚刚开始将我的一些应用程序从 Zend#1 迁移到 Zend#3。一切正常,但关于视图,我在理解基本概念时遇到了一些麻烦。

教程建议我的项目布局是这样的:

module
  Application
    view
      application
        index
          main.phtml
          foo.phtml
        baz
          index.phtml

我想知道为什么您需要复制视图目录中的 "application" 文件夹 - 您已经在模块的 hirachy 目录中。有没有办法更改默认模板解析器的搜索路径,以便省略模块名称?仅仅依靠 viewManager 的 "template_path_stack" 是行不通的。我真的需要在这里编写自定义解析器吗?

非常感谢!

PS。不,我不想在这里使用自定义模板贴图 ;-) 如果可能的话,我想了解并使用没有模板贴图的默认左轮手枪。

找到一种可能的解决方案!

在您模块的配置中将此添加到 view_manager::

'controller_map' => [
    'Dashboard\Controller\DashboardController' => 'Dashboard'
],

框架现在将寻找 "Dashboard/view/[controller]/[action].phtml",而不是寻找名为 "Dashboard/view/dashboard/[controller]/[action].phtml" 的模板。基本上,您是在告诉 Zend 在此处使用某种 shorthand 并从模板分辨率中删除数组的值(查看 InjectTemplateListener::mapController())

无论如何...欢迎更好的解决方案和解释!

"Application"是你整体中的模块名称 'application.' 一开始,"Application"是唯一的模块,但添加其他模块很常见:你可能有"Clients" 的一个模块和 "Vendors." 的另一个模块视图文件夹的层次结构遵循与 ModuleName:ControllerName:ActionName 相同的层次结构,并且 ZF 需要在视图文件夹层次结构中使用模块名称以防您碰巧在两个或多个模块中具有相同的控制器和动作名称对。 "Clients" 模块和 "Vendors" 模块很可能都会有一个 "index" 动作。两者不太可能具有相同的控制器名称,但这并非完全不可能。如果您在 "Clients" 模块和 "Vendors" 模块中都有一个名为 "Contacts" 的控制器,则 "contacts/index" 的信息不足以告诉 ZF 使用哪个视图。它需要文件夹层次结构中的模块名称来区分 "clients/contacts/index" 和 "vendors/contacts/index"。

更新

让您大开眼界的一点是,ZF3 从您的所有不同模块中获取诸如路由器定义、视图文件夹以及谁知道还有什么的东西,并将它们聚合到一个结构中。换句话说,

module
  Application
    view
      application
        add
          add.phtml          
        delete
          delete.phtml          
        edit
          edit.phtml          
        index
          index.phtml          

module
  Clients
    view
      clients
        add-client
          add.phtml          
        delete-client
          delete.phtml          
        edit-client
          edit.phtml          
        client-index
          index.phtml          

module
  Vendors
    view
      vendors
        add-vendor
          add.phtml          
        delete-vendor
          delete.phtml          
        edit-vendor
          edit.phtml          
        vendor-index
          index.phtml

有点像这样被识别:

module
  ....
    view
      application
        add
          add.phtml          
        delete
          delete.phtml          
        edit
          edit.phtml          
        index
          index.phtml          
      clients
        add-client
          add.phtml          
        delete-client
          delete.phtml          
        edit-client
          edit.phtml          
        client-index
          index.phtml          
      vendors
        add-vendor
          add.phtml          
        delete-vendor
          delete.phtml          
        edit-vendor
          edit.phtml          
        vendor-index
          index.phtml

如果您愿意,您可以将所有视图文件放入一个模块中。

也许这有助于解释为什么 "view" 文件夹下包含具有模块名称的文件夹。 "view"文件夹上面模块名的文件夹有存储功能。 "view" 文件夹下具有模块名称的文件夹用作引用视图文件在聚合定义中与哪些模块相关联的方法。