zoukankan      html  css  js  c++  java
  • phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl

    制作简单的acl,

    dispatcher(专门用来加载或调度或跳转到相应的url地址即XXXcontroller的调度器或控制器,能够在controller执行前对controller进行停止跳转等),控制器提供了一堆可以被调用的方法,即:action。action是控制器中用于处理请求的方法。默认情况下,全部 控制器public的方法都会映射到action并且可以通过URL访问。action负责解释请求和创建响应.

    public/index.php

    $di['aclResource'] = function()
        {
            return include_once '../app/config/Acl.php';
        };
    
        //security
        $di['dispatcher'] = function(){
            //events
            $eventsManager = new PhalconEventsManager();
    
            //读取acl权限的类
            $security = new Security();
    
            //lisent
            $eventsManager->attach("dispatch", $security);
    
            //调度器通过事件侦听acl
            $dispatch = new PhalconMvcDispatcher();
            $dispatch->setEventsManager($eventsManager);
            return $dispatch;
        }
    

      

    app/plugins/Security类
    use PhalconMvcUserPlugin,
        PhalconEventsEvent,
        PhalconMvcDispatcher;
    
    class Security extends Plugin {
    
        public function __construct(){}
    
        public function _getAcl()
        {
            $acl = new PhalconAclAdapterMemory();
            //默认权限(禁止)
            $acl->setDefaultAction(PhalconAcl::DENY);
            //
            $aclResource = $this->_custAcl();
           foreach($aclResource as $key=>$value)
           {
               //创建角色,将角色添加到acl
              $acl->addRole($value['project_name']);
              foreach($value['resource'] as $ky=>$vy)
              {
                  foreach($vy as $k=>$v)
                  {
                      //添加资源
                      $acl->addResource(new PhalconAclResource(strtolower($ky)), $v);
                      //添加访问权限
                      $acl->allow($value['project_name'], strtolower($ky), $v);
                  }
              }
           }
            return $acl;
        }
    
        public function _custAcl()
        {
            if( $this->persistent->acl == null)
            {
                $aclResource = array();
                $acl = $this->aclResource['Acl'];
                $allResource = $this->aclResource['AllResource'];
                foreach($acl as $key=>$value)
                {
                    $tomer = array();
                    $tomer['project_name'] = $value;
                    foreach($allResource as $k=>$v)
                    {
                        if( strpos($k, strtolower($key) ) !== false )
                        {
                            $tomer['resource'] = $v;
                        }
                    }
                    $aclResource[$key] = $tomer;
                }
                $this->persistent->acl = $aclResource;
    
            }
           return $this->persistent->acl;
    
        }
    
        public function beforeExecuteRoute(Event $event, Dispatcher $dispatcher )
        {
           $controller = $dispatcher->getControllerName();
           $action = $dispatcher->getactionName();
           $role = '';
           if( $this->session->has('userInfo') )
           {
                $userInfo = $this->session->get('userInfo');
               $role = $userInfo['role'];
           }
           if(empty($role))$role = 'Operator';
           $acl = $this->_getAcl();
           $isAllowed = $acl->isAllowed($role, strtolower($controller), strtolower($action));
           if(!$isAllowed)
           {
               // echo "no access;";exit;
    $dispatcher->forward(array(
    'controller'=>'index',
    'action'=>'error',
    'params'=>array('msg'=>'no access')
    ));



    } } }

      

    那么,在indexController.php页面中,可以通过如下方法,获取params传过来的值:

    public function errorAction()
        {
            //获取传过来的参数
            $param = $this->dispatcher->getParams();
            $msg = isset($param['msg'])? $param['msg'] : '' ;
            
            
            $this->view->web_title = '错误';
            $this->view->pick('index/error');
        }
    

      

    循环调度事件(Dispatch Loop Events)

    PhalconMvcDispatcher 可以发送事件给当前的 EventsManager 。 事件会以“dispatch”类型被所触发。当返回false时有些事件可以终止当前激活的操作。已支持的事件如下:

    事件名称何时触发此操作是否可终止?触发于
    beforeDispatchLoop 在进入循环调度前触发。此时,调度器不知道将要执行的控制器或者动作是否存在。调度器只知道路由传递过来的信息。 侦听者
    beforeDispatch 在进入循环调度后触发。此时,调度器不知道将要执行的控制器或者动作是否存在。调度器只知道路由传递过来的信息。 侦听者
    beforeExecuteRoute 在执行控制器/动作方法前触发。此时,调度器已经初始化了控制器并知道动作是否存在。 侦听者/控制器
    initialize 允许在请求中全局初始化控制器。 控制器
    afterExecuteRoute 在执行控制器/动作方法后触发。由于此操作不可终止,所以仅在执行动作后才使用此事件进行清理工作。 侦听者/控制器
    beforeNotFoundAction 当控制器中的动作找不到时触发。 侦听者
    beforeException 在调度器抛出任意异常前触发。 侦听者
    afterDispatch 在执行控制器/动作方法后触发。由于此操作不可终止,所以仅在执行动作后才使用此事件进行清理工作。 侦听者
    afterDispatchLoop 在退出循环调度后触发。 侦听者






  • 相关阅读:
    【GMT43智能液晶模块】例程十四:MODBUS TCP实验——电源监控
    【GM4008】GM4008升级固件发布(版本V4.2.1.1)
    【iCore4 双核心板_FPGA】实验二十:NIOS II之UART串口通信实验
    我将要离开,广州!
    带你Python入门,踏进人工智能领域
    您还差宝贝一张语文教学光盘!教你如何制作ISO文件
    数据采集之登录那些事
    潮汕七样羹之情
    劣湿为始《清明之冬》
    福利预告,跳一跳助手即将发布,您不知道还有这些...
  • 原文地址:https://www.cnblogs.com/achengmu/p/6003425.html
Copyright © 2011-2022 走看看