想必大部分的人都是从ZendSkeletonApplication开始学习zf2的,也理所当然的认为每个module的view_manager是独立的,互补干扰的,
但是我们错了,不同module之间共用同一个view_manager配置,后来加载module的view_manager会覆盖前面加载的module的view_manager同名(即key值相同)配置,
这种设计大部分时候都没什么问题,但是layout这种配置就开始互相覆盖了,
开始介绍为不同模块配置不同的layout。
1.新建一个Test模块(将Application模块复制一份,改改相关的名字即可),
在zf2.local/module/Test/config/module.config.php的view_manager的template_map配置你module的layout路径,
代码如下:
'view_manager' => array(
'template_map' => array(
'test/layout' => __DIR__ . '/../view/test/layout/layout.phtml',
),
'template_path_stack' => array(
'test'=>__DIR__ . '/../view/'
),
)
2.修改zf2.local/module/Test/Module.php的class Module如下
class Module{
public function onBootstrap(MvcEvent $mvcEvent) {
$eventManager = $mvcEvent->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager); // Register a dispatch event
$application = $mvcEvent->getParam('application');
$application->getEventManager()->attach('dispatch', array($this, 'setLayout'));
}
/**
* @param/Zend/Mvc/MvcEvent $mvcEvent The MvcEvent instance
* @return void
*/
public function setLayout($mvcEvent) {
$matches = $mvcEvent->getRouteMatch();
$controller = $matches->getParam('controller');
if (false === strpos($controller, __NAMESPACE__)) {
// not a controller from this module
return false;
}
// Set the layout template
$viewModel = $mvcEvent->getViewModel();
$viewModel->setTemplate('test/layout');
}
public function getConfig() {
return include __DIR__ . '/config/module.config.php';
}
public function getAutoloaderConfig() {
return array(
'Zend/Loader/StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
}
但是我们错了,不同module之间共用同一个view_manager配置,后来加载module的view_manager会覆盖前面加载的module的view_manager同名(即key值相同)配置,
这种设计大部分时候都没什么问题,但是layout这种配置就开始互相覆盖了,
开始介绍为不同模块配置不同的layout。
1.新建一个Test模块(将Application模块复制一份,改改相关的名字即可),
在zf2.local/module/Test/config/module.config.php的view_manager的template_map配置你module的layout路径,
代码如下:
'view_manager' => array(
'template_map' => array(
'test/layout' => __DIR__ . '/../view/test/layout/layout.phtml',
),
'template_path_stack' => array(
'test'=>__DIR__ . '/../view/'
),
)
2.修改zf2.local/module/Test/Module.php的class Module如下
class Module{
public function onBootstrap(MvcEvent $mvcEvent) {
$eventManager = $mvcEvent->getApplication()->getEventManager();
$moduleRouteListener = new ModuleRouteListener();
$moduleRouteListener->attach($eventManager); // Register a dispatch event
$application = $mvcEvent->getParam('application');
$application->getEventManager()->attach('dispatch', array($this, 'setLayout'));
}
/**
* @param/Zend/Mvc/MvcEvent $mvcEvent The MvcEvent instance
* @return void
*/
public function setLayout($mvcEvent) {
$matches = $mvcEvent->getRouteMatch();
$controller = $matches->getParam('controller');
if (false === strpos($controller, __NAMESPACE__)) {
// not a controller from this module
return false;
}
// Set the layout template
$viewModel = $mvcEvent->getViewModel();
$viewModel->setTemplate('test/layout');
}
public function getConfig() {
return include __DIR__ . '/config/module.config.php';
}
public function getAutoloaderConfig() {
return array(
'Zend/Loader/StandardAutoloader' => array(
'namespaces' => array(
__NAMESPACE__ => __DIR__ . '/src/' . __NAMESPACE__,
),
),
);
}
}
然后就可以达到不同module使用不同layout。