【问题标题】:Redirect to Literal route by its name from Module.php从 Module.php 按名称重定向到 Literal 路由
【发布时间】:2014-11-21 13:58:38
【问题描述】:

我在Module.php 中使用Acl,如果用户未经授权,我想将他们重定向到特定路线。 我的路线是 Literal 并且是无参数的(即,在配置中设置了默认控制器和操作参数)。

我只是找不到这样做的方法。

实际上我知道我可以设置我的RouteMatch 的控制器和操作参数(我从MvcEvent 得到它)但我想通过它的名称设置一个新的路由而不设置参数。

感谢任何帮助,谢谢

【问题讨论】:

    标签: php zend-framework2


    【解决方案1】:

    这取决于您要从哪里重定向的函数定义。

    1. 可以是一个简单直接的onBootstrap -> on Dispatch,一个函数定义-

    例如:

    use Zend\Mvc\MvcEvent;
    .....
    ........
    
    class Module {
    
        public function onBootstrap(MvcEvent $e)
        {
            $e->getApplication()->getEventManager()->getSharedManager()->attach('SOME_CONTROLLER OR * (-> all controllers)', 'dispatch', function($e) {
                $controller = $e->getTarget();
                if (unauthorized_user) {
                    $controller->plugin('redirect')->toRoute('ROUTE_NAME');
                }
            }, 100);
        }
        ......
        ........
    }
    
    1. 其他可能是onBootstrap -> on Route -

    这很棘手,因为该函数甚至在路由完成之前就已执行,因此您还没有 $e->getTarget() 即控制器对象。

    public function onBootstrap(MvcEvent $e) {
        $e->getApplication()
                ->getEventManager()
                ->getSharedManager()
                ->attach('*', 'route', function($e) {
    
            if (unauthorized_user) {
                return $this->customRedirect($e, 'ROUTE_NAME');
            } else {
                return $this->customRedirect($e, 'ROUTE_NAME', 'ACTION_NAME');
            }
        }, 100);
    }
    
    public function customRedirect($event, $route, $action = '') {
        $url = $event->getRouter()->assemble(array('action' => $action), array('name' => $route));
    
        $response = $event->getResponse();
        $response->getHeaders()->addHeaderLine('Location', $url);
        $response->setStatusCode(302);
        $response->sendHeaders();
        exit();
    }
    

    以防万一获取当前的 route_name、controller_name 和 action_name。

    可以用这个-

    $sm = $e->getApplication()->getServiceManager();
    $router = $sm->get('router');
    $request = $sm->get('request');
    $matchedRoute = $router->match($request);
    $params = $matchedRoute->getParams();
    
    $route_name = $matchedRoute->getMatchedRouteName();
    $controller_name = $params['controller'];
    $action_name = $params['action'];
    

    我希望它对某人有所帮助。

    【讨论】:

    • 发送标头与 $router->assemble() 对我来说似乎是最好的方法 - 如果一切正常,我会尝试并将其标记为答案
    • 好的,谢谢!不知道路由器的assemble()方法
    猜你喜欢
    • 2017-11-01
    • 1970-01-01
    • 2018-05-10
    • 2016-12-09
    • 2015-11-24
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多