Zend framework Zend 3-更改模板基路径

Zend framework Zend 3-更改模板基路径,zend-framework,view,zend-framework3,base-path,Zend Framework,View,Zend Framework3,Base Path,我刚刚开始将我的一些应用程序从Zend#1迁移到Zend#3。一切都很好,但是关于视图,我在理解基本概念方面有一些困难 正如教程所示,我的项目布局如下: module Application view application index main.phtml foo.phtml baz index.phtml 我想知道为什么您需要在视图目录中复制“应用程序”文件夹-您已经在模块的

我刚刚开始将我的一些应用程序从Zend#1迁移到Zend#3。一切都很好,但是关于视图,我在理解基本概念方面有一些困难

正如教程所示,我的项目布局如下:

module
  Application
    view
      application
        index
          main.phtml
          foo.phtml
        baz
          index.phtml
我想知道为什么您需要在视图目录中复制“应用程序”文件夹-您已经在模块的hirachy目录中了。是否有方法更改默认模板解析器的搜索路径,以便忽略模块名称?仅仅依靠viewManager的“模板路径堆栈”是不起作用的。我真的需要在这里编写自定义解析器吗

非常感谢


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

找到了一个可能的解决方案

在模块的配置中,将此项添加到视图管理器:

'controller_map' => [
    'Dashboard\Controller\DashboardController' => 'Dashboard'
],
框架不再寻找名为“Dashboard/view/Dashboard/[controller]/[action].phtml”的模板,而是寻找“Dashboard/view/[controller]/[action].phtml”。基本上,您是在告诉Zend在这里使用某种速记,并从模板解析中删除数组的值(请看InjectTemplateListener::mapController()


无论如何。。。欢迎提供更好的解决方案和解释

找到了一个可能的解决方案

在模块的配置中,将此项添加到视图管理器:

'controller_map' => [
    'Dashboard\Controller\DashboardController' => 'Dashboard'
],
框架不再寻找名为“Dashboard/view/Dashboard/[controller]/[action].phtml”的模板,而是寻找“Dashboard/view/[controller]/[action].phtml”。基本上,您是在告诉Zend在这里使用某种速记,并从模板解析中删除数组的值(请看InjectTemplateListener::mapController()

无论如何。。。欢迎提供更好的解决方案和解释

“应用程序”是整个“应用程序”中某个模块的名称。开始时,“应用程序”是唯一的模块,但添加其他模块很常见:您可能有一个模块用于“客户端”,另一个模块用于“供应商”。视图文件夹的层次结构与ModuleName:ControllerName:ActionName的层次结构相同,ZF需要在视图文件夹层次结构中使用模块名称,以防在两个或多个模块中碰巧有相同的控制器和操作名称对。“客户”模块和“供应商”模块很可能都有“索引”操作。这两个控制器的名称不太可能相同,但也不是完全不可能。如果在“客户”模块和“供应商”模块中都有名为“联系人”的控制器,“联系人/索引”不足以告诉ZF要使用哪个视图。它需要文件夹层次结构中的模块名称来区分“客户/联系人/索引”和“供应商/联系人/索引”

更新 值得一提的是,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
如果愿意,您可以将所有视图文件放在一个模块中

也许这有助于解释为什么在“视图”文件夹下包含具有模块名称的文件夹。模块名称位于“视图”文件夹上方的文件夹具有存储功能。“视图”文件夹下方具有模块名称的文件夹用作参考聚合定义中与视图文件关联的模块的方法

“应用程序”是整个“应用程序”中某个模块的名称。开始时,“应用程序”是唯一的模块,但添加其他模块很常见:您可能有一个模块用于“客户端”,另一个模块用于“供应商”。视图文件夹的层次结构与ModuleName:ControllerName:ActionName的层次结构相同,ZF需要在视图文件夹层次结构中使用模块名称,以防在两个或多个模块中碰巧有相同的控制器和操作名称对。“客户”模块和“供应商”模块很可能都有“索引”操作。这两个控制器的名称不太可能相同,但也不是完全不可能。如果在“客户”模块和“供应商”模块中都有名为“联系人”的控制器,“联系人/索引”不足以告诉ZF要使用哪个视图。它需要文件夹层次结构中的模块名称来区分“客户/联系人/索引”和“供应商/联系人/索引”

更新 值得一提的是,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
如果愿意,您可以将所有视图文件放在一个模块中


也许这有助于解释为什么在“视图”文件夹下包含具有模块名称的文件夹。模块名称位于“视图”文件夹上方的文件夹具有存储功能。“视图”文件夹下方具有模块名称的文件夹用作参考聚合定义中与视图文件关联的模块的方法

我明白了-太多了!“模块”的定义在ZF1中有点不同。除了使用控制器映射进行vodoo或为自己编写解析程序外,是否还有其他方法可以将我的代码放在“子模块”中,如“模块\网站\管理员\控制器\用户控制器”和“模块\网站\管理员\视图\用户\列表.phtml”中相应的视图脚本?。。。或“模块\网站\报告\控制器\控制器”。。。或“模块\网站\ Cms\控制器\控制器”。。。或者“module\Api\Admin\Controller\FooController”,您就知道了;-)我认为有可能设计出一种不同层次结构的代码组织方式