1

我想为新的 Controller 设置不同的布局,请提供您对在控制器上设置它的理想位置的建议?现在我正在使用$this->layout()每一个动作。在 ZF1 中曾经有preDispatch,不知道它在 ZF2 中是如何实现的。

4

1 回答 1

3

dispatch当调用控制器动作时,每个控制器都会触发一个事件。这个事件被封装在一个EventManager包含一些标识符的对象中。这使得 a可以使用特定标识符SharedEventManager侦听 EventManager 中的特定事件

现在每个控制器(例如MyModule\Controller\FooController)都有两个已知的标识符:

  1. 班级名称 ( MyModule\Controller\FooController)
  2. 类的顶级命名空间 ( 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 回答