【发布时间】:2012-12-15 08:35:31
【问题描述】:
我想为新的 Controller 设置不同的布局,请提供您的建议,以便在控制器上设置它的理想位置?现在我在每一个动作中都使用$this->layout()。 ZF1中曾经有preDispatch,不知道ZF2是怎么实现的。
【问题讨论】:
标签: php layout controller zend-framework2
我想为新的 Controller 设置不同的布局,请提供您的建议,以便在控制器上设置它的理想位置?现在我在每一个动作中都使用$this->layout()。 ZF1中曾经有preDispatch,不知道ZF2是怎么实现的。
【问题讨论】:
标签: php layout controller zend-framework2
当调用控制器动作时,每个控制器都会触发一个事件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 的数组,其余的由模块处理。
【讨论】: