制作简单的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 在退出循环调度后触发。 侦听者


phalcon: eventManager事件管理(结合dispatcher调度控制器)制作简单的acl的更多相关文章

  1. phalcon: plugin 结合Manager事件管理、dispatcher调度控制器 监听sql日志记录或其他拦截出来

    可能用到的类 phalcon\mvc\use\plugin Phalcon\Mvc\Dispatcher as MvcDispatcher Phalcon\Events\Manager as Even ...

  2. phalcon: dispatcher调度控制器

    phalcon: dispatcher调度控制器 我所理解的dispatcher调度控制器,实际上是对 router或者特定的url参数给与重组. 引用特定的类: //add use Phalcon\ ...

  3. phalcon: Profiling分析 profilter / Plugin结合,dispatcher调度控制器 监听sql执行日志

    个人觉得profilter 跟 logger 功能差不多,logger的功能在于写入,profilter功能在于sql后及时显示分析.都是对sql执行的的分析:一个是写入log文件,一个是直接在页面展 ...

  4. phalcon——调度控制器

    将侦听者绑定到组件上: use Phalcon\Mvc\Dispatcher as MvcDispatcher, Phalcon\Events\Manager as EventsManager; $d ...

  5. phalcon:model 事件与事件管理器

    事件与事件管理器(Events and Events Manager)¶ Models allow you to implement events that will be thrown when p ...

  6. storm事件管理器EventManager源码分析-event.clj

    storm事件管理器定义在event.clj中,主要功能就是通过独立线程执行"事件处理函数".我们可以将"事件处理函数"添加到EventManager的阻塞队列 ...

  7. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  8. Redis事件管理(一)

    Redis统一的时间管理器,同时管理文件事件和定时器, 这个管理器的定义: #if defined(__APPLE__) #define HAVE_TASKINFO 1 #endif /* Test ...

  9. zendframework 事件管理(二)

    首先需要明确的几个问题: Q1.什么是事件? A:事件就是一个有名字的行为.当这个行为发生的时候,称这个事件被触发. Q2.监听器又是什么? A:监听器决定了事件的逻辑表达,由事件触发.监听器和事件往 ...

随机推荐

  1. 零零碎碎写的shell脚本(二):一键修改网络配置信息脚本

    #!/bin/bash ip_mod=$ mask_mod=$ gw_mod=$ dns_mod=$ hostname_mod=$ hosts=/etc/hosts ifcfg=/etc/syscon ...

  2. ContentProvider官方教程(4)ContentResolver权限

    Content Provider Permissions A provider's application can specify permissions that other application ...

  3. Ubuntu安装后的一些配置

    对新安装的Ubuntu的一些配置: #移除无用包 apt-get remove libreoffice-common apt-get remove unity-webapps-common apt-g ...

  4. HDU 5615 Jam's math problem

    Jam's math problem Problem Description Jam has a math problem. He just learned factorization.He is t ...

  5. <转>如何改变讨好型人格 | 你根本不需要讨好任何人

    在我过去二十多年的生命里一直是一个“讨好者”. 我总是活在别人对我的期待中,我总是不停的追逐着别人对我的认可,我总是像个卑微的奴才一样去满足别人的需求. 但就和大多数的“讨好者”一样,我们越是寻求别人 ...

  6. HTML Meta标签中的viewport属性含义及设置

    两篇文章 第1篇文章 第2篇文章 http://blog.hexu.org/archives/1947.shtml 随着高端手机(Andriod,Iphone,Ipod,WinPhone等)的盛行,移 ...

  7. FJNU 1159 Fat Brother’s new way(胖哥的新姿势)

    FJNU 1159 Fat Brother’s new way(胖哥的新姿势) Time Limit: 1000MS   Memory Limit: 257792K [Description] [题目 ...

  8. So easy Webservice 4.Java方式访问WebService(使用jdk1.6以上 wsimport命令)

    1.选中要调用的服务单击”服务说明” 2.获取wsdl文件.使用JDK1.6以上的版本的wsimport命令 a) 例如选中:http://webservice.webxml.com.cn/WebSe ...

  9. eclipse svn异常:RA layer request failed 的解决方案

    这几天svn总是出问题,网上搜了好多资料,今天才真正找到解决办法. RA layer request failedsvn: OPTIONS of 'https://192.168.0.104/svn/ ...

  10. Webbrowser控件判断网页加载完毕的简单方法 (转)

    摘自:http://blog.csdn.net/cometnet/article/details/5261192 一般情况下,当ReadyState属性变成READYSTATE_COMPLETE时,W ...