douluan8828 2017-06-22 15:12
浏览 77
已采纳

在父控制器中重定向

in my ZF2 (2.4.5) project I have main (parent) controller with function to validate user rights so every inherited controller can easily acces it. However there's a problem with redirect. I know that inherited controller's action has to return response, but is it possible to force redirection in parent controller?

Parent controller

<?php

namespace Application;

use Zend\Mvc\Controller\AbstractActionController;

class CoreController extends AbstractActionController{

    public function checkAccess($moduleName, $accessName){
        if($this->getAclService()->isAllowed($moduleName, $accessName)){
            self::redirect()->toRoute('access-denied');
        }
    }
}

Inherited controller

namespace Application\Controller;

use Application\CoreController;
use Zend\View\Model\ViewModel;

class InterfaceController extends CoreController{

    public function indexAction(){

        $this->checkAccess('Foo', 'Bar');

        return new ViewModel([

        ]);
    }
}

TL;DR If I call $this->checkAccess('Foo', 'Bar'); in InterfaceController and $this->getAclService()->isAllowed($moduleName, $accessName) in CoreController returns false I want to redirect user to route 'access-denied' immediately without completing rest of InterfaceController::indexAction

Important: I want to avoid checking what checkAccess returns, I just force redirection.

Thanks in advance for response.

  • 写回答

3条回答 默认 最新

  • douzi8127 2017-10-19 13:40
    关注

    Ok I did this using global exception handler

    Child controller

    <?php
    
    namespace Warehouse\Controller;
    
    use Application\CoreController;
    use Zend\View\Model\ViewModel;
    
    class IndexController extends CoreController {
    
        public function getWarehouseDocumentAction() {
            parent::checkAccess('Warehouse', 'incoming-goods');
    
            return new ViewModel([
                'foo' => 'bar',
            ]);
        }
    
    }
    

    Parent controller

    namespace Application;
    
    use Application\Exception\InsufficientPermissionException;
    use Zend\Mvc\Controller\AbstractActionController;
    
    class CoreController extends AbstractActionController {
    
        public function checkAccess($moduleName, $accessName){
            if(!$this->getServiceLocator()->get(MyAcl::class)->isAllowed($moduleName, $accessName, $this->identity())){
                throw new InsufficientPermissionException('Access denied. Insufficient permission.');
            }
        }
    }
    

    Module.php

    <?php
    
    namespace Application;
    
    use Application\Exception\InsufficientPermissionException;
    use Application\Monolog\Handler\DoctrineLogMessageHandler;
    use Zend\Mvc\MvcEvent;
    
    class Module {
    
        public function onBootstrap(MvcEvent $e) {
    
            $sharedEvents = $e->getApplication()->getEventManager()->getSharedManager();
    
            $sharedEvents->attach('Zend\Mvc\Application', 'dispatch.error', function (MvcEvent $event) {
                if (php_sapi_name() !== 'cli') {
                    $exception = $event->getParam('exception');
                    if ($exception instanceof InsufficientPermissionException) {
                        $target = $event->getTarget();
                        return $target->redirect()->toRoute('access-denied');
                    }
                }
            });
    
        }
    }
    

    Permissions are held in database.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 BP神经网络控制倒立摆
  • ¥20 要这个数学建模编程的代码 并且能完整允许出来结果 完整的过程和数据的结果
  • ¥15 html5+css和javascript有人可以帮吗?图片要怎么插入代码里面啊
  • ¥30 Unity接入微信SDK 无法开启摄像头
  • ¥20 有偿 写代码 要用特定的软件anaconda 里的jvpyter 用python3写
  • ¥20 cad图纸,chx-3六轴码垛机器人
  • ¥15 移动摄像头专网需要解vlan
  • ¥20 access多表提取相同字段数据并合并
  • ¥20 基于MSP430f5529的MPU6050驱动,求出欧拉角
  • ¥20 Java-Oj-桌布的计算