我想为新的 Controller 设置不同的布局,请提供您对在控制器上设置它的理想位置的建议?现在我正在使用$this->layout()
每一个动作。在 ZF1 中曾经有preDispatch
,不知道它在 ZF2 中是如何实现的。
问问题
1747 次
1 回答
3
dispatch
当调用控制器动作时,每个控制器都会触发一个事件。这个事件被封装在一个EventManager
包含一些标识符的对象中。这使得 a可以使用特定标识符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');
});
}
}
这种方法(如何在特定模块内使用控制器进行操作)也在我的博客文章中进行了说明。因为模块特定的布局在 Zend Framework 2 中变得相当普遍,Evan Coury 为此制作了一个模块。它被称为EdpModuleLayout,安装模块时它相当容易。
MyModule
您在配置中提供一个=>数组,layout/template
其余的由模块处理。
于 2012-12-31T09:14:44.857 回答