更改类模块中的控制器和操作

时间:2017-03-23 09:21:22

标签: zend-framework2 zend-framework3

如何在Module.php文件中的类Module中更改控制器和操作?必须在没有重定向的情况下限制访问。 URI应保持不变。因此,有必要不仅覆盖模板输出,即控制器和动作。

1 个答案:

答案 0 :(得分:1)

您要实现的目标是更改匹配的路由处理程序。你可以这样做:

<?php
/* module/Application/src/Module.php */

namespace Application;

use Application\Controller\IndexController;
use Zend\EventManager\EventInterface;
use Zend\ModuleManager\Feature\BootstrapListenerInterface;
use Zend\Mvc\MvcEvent;
use Zend\Router\Http\RouteMatch;

class Module implements BootstrapListenerInterface
{
    public function getConfig()
    {
        return include __DIR__ . '/../config/module.config.php';
    }

    public function onBootstrap(EventInterface $e)
    {
        if (!$e instanceof MvcEvent) {
            return;
        }

        $em = $e->getApplication()->getEventManager();
        $em->attach(MvcEvent::EVENT_DISPATCH, [$this, 'preCheck'], 1000);
    }

    public function preCheck(MvcEvent $e)
    {
        $e->setRouteMatch(new RouteMatch([
            'controller' => IndexController::class,
            'action' => 'test'
        ]));
    }
}

在onBoostrap方法中,您为dispatch事件注册一个事件处理程序。在执行控制器操作之前触发此事件。在您的事件处理程序中,您可以覆盖已匹配的路由。 使用此解决方案,您可以保持相同的路由,但另一个控制器可以处理请求。