由于将在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(组名/模块)访问它们。
感谢您的时间!
答案 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