子文件夹中的ZF2模块

时间:2014-04-10 04:00:59

标签: module zend-framework2 subdirectory

由于将在ZF2中实现的大型项目,我遇到了以下问题,我似乎误解了名称空间的处理。

该项目将有许多类似组的模块。我将有4组(A,B,C,D),A组中的所有模块都将处理输入。为了确保我们最终没有包含200个模块的文件夹,我们希望将出于清洁原因的组合在一起。

所以基本上我们希望有以下结构:

/config
/module
  /MainApplication <- accesses all modules
  /groupA
    /Module1
    /Module2
  /groupB
    /Module3
    /Module4
...

我已经将命名空间调整为groupA\Module1,相应地调整了路径,并且所有路径似乎都是正确的,但我得到错误,例如无法访问模板文件。

您能否给我一个提示,当您将模型从/modules/module1移动到/modules/subfolder/module1时,您需要注意什么。

我尝试了什么

Changed all namespaces to: -------------------------------------------
    groupa\module1[\Controller]; 

/config/application.php: ---------------------------------------------
...
    'modules' => array(
        'groupa\module1',
    ),
...

/module/groupa/Module.php: -------------------------------------------
...
    'route'    => '/',
    'defaults' => array(
        'controller' => 'groupa\module1\Controller\Index',
        'action'     => 'index',
    ),
...
'controllers' => array(
    'invokables' => array(
        'groupa\module1\Controller\Index' => 'groupa\module1\Controller\IndexController'

目前,该模块不应该做太多。只显示index.phtml模板。我得到的错误如下:

Fatal error: Uncaught exception 'Zend\View\Exception\RuntimeException' with message 'Zend\View\Renderer\PhpRenderer::render: Unable to render template "groupa/index/index"; 

resolver could not resolve to a file' in /Users/xxx/Sites/zf2helloworld/vendor/Zend/View/Renderer/PhpRenderer.php:461 

Stack trace: 
#0 /Users/xxx/Sites/zf2helloworld/vendor/Zend/View/View.php(203): Zend\View\Renderer\PhpRenderer->render(Object(Zend\View\Model\ViewModel)) 
#1 /Users/xxx/Sites/zf2helloworld/vendor/Zend/View/View.php(231): Zend\View\View->render(Object(Zend\View\Model\ViewModel)) 
#2 /Users/xxx/Sites/zf2helloworld/vendor/Zend/View/View.php(196): Zend\View\View->renderChildren(Object(Zend\View\Model\ViewModel)) 
#3 /Users/xxx/Sites/zf2helloworld/vendor/Zend/Mvc/View/Http/DefaultRenderingStrategy.php(128): Zend\View\View->render(Object(Zend\View\Model\ViewModel)) 
#4 [internal function]: Zend\Mvc\View\Http\DefaultRenderingStrategy->render(Object(Zend\Mvc\MvcEvent)) 
#5 /Users/xxx/Sites/zf2helloworld/vendor/Zend/EventManager/Ev in /Users/xxx/Sites/zf2helloworld/vendor/Zend/View/Renderer/PhpRenderer.php on line 461

我错过了明显的事吗?为什么找不到模板?我回复了'template_path_stack',似乎是正确的:

/Users/xxx/Sites/zf2helloworld/module/groupa/module1/view

我知道模块的可重用性等。我们仍然希望将属于一起的模块分组到同一个文件夹中,最好通过正确的URL(组名/模块)访问它们。

感谢您的时间!

1 个答案:

答案 0 :(得分:1)

首先,根据PSR-0 standard,您的类名必须具有以下结构:\<Vendor Name>\(<Namespace>\)*<Class Name>
这意味着您的模块名称应为<Vendor Name>\<Module\Name>

对于模板名称,默认情况下,控制器的FQCN将转换为此First namespace/controller class name/controller action name的模板 这意味着您的Groupa\Module1\Controller\IndexController控制器将为您提供模板名称groupa/index/index(而不是您所期望的groupa/module1/index/index),该文件将被解析为groupa/index/index.phtml在{{1}中定义的路径中}

这是默认行为,如果没有向后兼容性中断,则无法更改。为了缓解zf2.3以来的情况,有一个新的设置可以让你以你想要的方式使用模块。 它是template_path_stack配置部分下的controller_map

如何使用,你可以在这里阅读: https://github.com/zendframework/zf2/pull/5670

view_manager