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 \Phalcon\Events\Manager();

        //读取acl权限的类
        $security = new Security();

        //lisent
        $eventsManager->attach("dispatch", $security);

        //调度器通过事件侦听acl
        $dispatch = new \Phalcon\Mvc\Dispatcher();
        $dispatch->setEventsManager($eventsManager);
        return $dispatch;
    }

  

app/plugins/Security类
use \Phalcon\Mvc\User\Plugin,
    \Phalcon\Events\Event,
    \Phalcon\Mvc\Dispatcher;

class Security extends Plugin {

    public function __construct(){}

    public function _getAcl()
    {
        $acl = new \Phalcon\Acl\Adapter\Memory();
        //默认权限(禁止)
        $acl->setDefaultAction(\Phalcon\Acl::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 \Phalcon\Acl\Resource(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)

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

 

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






 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值