我想为新的控制器设置不同的布局,请在理想的位置提供您的建议,以便在控制器上设置它?现在我在每个动作中使用$this->layout()
。在ZF1中曾经有preDispatch
,不确定它是如何在ZF2中实现的。
答案 0 :(得分:3)
每个控制器在调用控制器操作时触发事件dispatch
。此事件封装在包含一些标识符的EventManager
对象中。这使得SharedEventManager
可以使用特定标识符在具有的EventManager中侦听特定事件。
现在每个控制器(例如MyModule\Controller\FooController
)都有两个已知的标识符:
MyModule\Controller\FooController
)MyModule
)MyModule的Module.php类是放置此逻辑的最佳位置。当应用程序引导时,为附加事件附加此模块的侦听器(即Module.php类的名称空间!)。这可以确保在调用控制器的操作时调用该函数,但是在调度另一个控制器时监听器不会执行。
namespace MyModule;
use Zend\Mvc\MvcEvent;
class Module
{
public function onBootstrap($e)
{
$app = $e->getApplication();
$em = $app->getEventManager(); // Specific event manager from App
$sem = $em->getSharedManager(); // The shared event manager
$sem->attach(__NAMESPACE__, MvcEvent::EVENT_DISPATCH, function($e) {
$controller = $e->getTarget(); // The controller which is dispatched
$controller->layout('layout/my-module-layout');
});
}
}
这个方法(如何使用特定模块内的控制器)也在blog post of mine解释。因为模块特定的布局在Zend Framework 2中变得非常普遍,所以Evan Coury为此制作了一个模块。它被称为EdpModuleLayout,安装模块时相当容易。
您提供的数组MyModule
=>在配置中layout/template
,模块处理其余部分。