如何laravel 建立控制器自己的基类控制器

相关文章推荐
Yii2 Component类是整个Yii2 框架的基础,它重写了从Object类继承而来的getter和setter方法,主要添加的以下属性:
1. getter不止可以获取类中的属性,同时可以获...
所有的迷惑都会在源码中得到解答
来一浏览器的请求发送到yii时是如何被变更为对应的controller=>action进行处理的呢??
一言不合上代码,清除处理主要在web\application...
先说一下Yii中的控制器是做什么用的,以及在什么地方使用.
在Yii中,当请求一个Url的时候,首先在application中获取request信息,然后由request通过urlManager...
ActionFilter
AccessControl
AccessRule
VerbFilter
1 ActionFilter动作过滤器的基类, 有两个重要的变量, 这两个变量都是存储actio...
yii中可以很方便的使用memcache
在main.php的components中加入cache配置
'components'=>array(
php实现类文件自动载入有两种办法:
魔术方法:__autoload();
SPL标准库提供的spl_autoload_register();
一、__autoload()__autoload()是p...
CBaseController是控制器和挂件的基类,主要提供了视图渲染,挂件,剪辑、片段缓存等方法,CController是所有应用中自定义控制器的基类。
public functi...
从微软的DBML文件中我们能学到什么(它告诉了我们什么是微软的重中之重)~七 为DBContext对象应该作为其它实体操作类型的基类,并为它提供统一的提交动作
一 DBContext的构...
客户端请求后的运行流程
1 示例AccessControl是框架自带的,位于yii\filters目录下class SiteController extends Controller
protected function runWithParamsInternal($object, $method, $params)
$ps=array();
他的最新文章
讲师:董晓杰
讲师:姚远
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)如何建立自己的基类控制器_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
如何建立自己的基类控制器
我有更好的答案
class MY_Controller extends CI_Controller{//do something}class Front_Controller extends MY_Controller{//for front controller}class Backend_Controller extends MY_Controller{// for backend controller}
为您推荐:
其他类似问题
您可能关注的内容
控制器的相关知识
换一换
回答问题,赢新手礼包&&&&&&&&ASP.NET 创建自定义数据控制器基类
正在努力加载播放器,请稍等…
正在努力加载播放器
大小:240.37KB&&所需金币:50
&& & 金币不足怎么办?
下载量:-次 浏览量:61次
贡献时间: 23:00:00
文档标签:
已有-位用户参与评分
同类热门文档
你可能喜欢
看过这篇文档的还看过
阅读:2494&&下载:35
阅读:433&&下载:1
阅读:568&&下载:1
阅读:170&&下载:1
阅读:80&&下载:0
阅读:185&&下载:0
阅读:134&&下载:0
阅读:118&&下载:0
阅读:316&&下载:0
阅读:80&&下载:0
该用户的其他文档
所需财富值:
50文件大小:240.37KB
您当前剩余财富值:&&
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
举报该文档侵犯版权。
例: /help.shtmlsite_controller控制器基类
前台控制器专用基类
前台控制器
拼接有效的URL地址
&?php&&&&...&&&&$this-&gen_url(array('app'=&$app_id,&'ctl'=&$ctl,'act'=&$act,'args'=&array(($tmp&=&time())))),&&&&...
对view下html页面进行编译,设置头部信息,并把生成的html。此生成的时候全页页面的main区域的html
供site_router下的dispatch方法构成全页页面使用
&?php&&&&...&&&&$this-&page('site/member/main.html');&&&&...
直接跳转到指定地址
boolean $js_jump
&?php&&&&...&&&&$this-&redirect(array('app'=&'b2c','ctl'=&'site_cart','act'=&'loginbuy','arg0'=&'1'));&&&&...
begin end 或者 begin end_only函数配合使用,可对运行程序的错误信息进行处理后在进行显示
错误处理开始
显示处理结果,显示成功或失败页面
只显示错误信息
显示处理结果页面,可以用于状态提示跳转,如:是否已经登录的提示跳转
$status 'success' or 'failed'
$jumpto 跳转的URL
显示的提示信息
注意: $jumpto参数中有两个特殊参数
1)当$jumpto='back'时,跳转的是返回的页面
2)当$jumpto='close'时,则不进行跳转,关闭本页面
&?php&&&&...&&&&$url&=&$this-&gen_url(array('app'=&'b2c','ctl'=&"site_member",'act'=&"setting"));&&&&$this-&splash('failed',$url&,&app::get('b2c')-&_('邮件已经存在'));&&&&...
提取html页面中的css样式
public function extract_widgets_css(&$body)
$body(html)
生成widgets特有的前缀信息(用于缓存)
public function create_widgets_key_prefix($values, $varys)
widgets中widgets.php定义的$stting[varys]的信息
设置主题模版类型,设置调用的模板页面,如果没有设置系统默认的调用模板的default.html
当在theme中添加了一个自定义的模板页面,则要使用此页面的时候,需要在page方法的前面
用此方法定义好。
final public function set_tmpl($tmpl)
模板页面的名字(index,default)
读取主题模版类型,获取set_tmpl设置的值,此方法一般用不到,是系统自己调用的方法final public function get_tmpl()
设置主题模板文件,设置页面调用的模板,不同模板样式不同(模板中的html页面:page-help.html)
如果定义的模板文件不是在theme的时候则需要用set_tmpl_file来设置页面调用的模板final public function set_tmpl_file($tmpl_file)
$tmpl_file
模板中的页面文件(page-help.html)
读取主题模板文件,获取set_tmpl_file定义的值,此一般是在page方法中调用了,所以一般用page来显示页面就可以了
final public function get_tmpl_file()
设置头部max-age信息,提共给page方法或其他显示页面使用
Cache-control: max-age=5(表示当访问此网页后的5秒内再次访问不会去服务器)
$time设置超时时间
设置Cache-control:no_cache参数
var boolean $status
设置Cache-control:no_store
当header设置为Cache-control:no_cache,no_store是,系统则不会对此页面进行缓存参数
var boolean $status
设置Cache-control:public(rivate)参数
默认为pulbic
修改(替换,添加,删除)html页面的内容,修改的是对应的页面的html内容
service注册的ID为site_controller_content&service id=&site_controller_content&&
&class&ecbook_service_modifyhtml&/class&
&/service&
ecbook_service_modifyhtml类的写法
&?phpclass&ecbook_service_modifyhtml&implements&site_interface_controller_content{&&&&public&function&modify(&$html,&&$obj){&&&&&&&&//$html为此页面的所有的html,在此可以做完修改后进行返回就好&&&&&&&&$arr&='xxxxxx';&&&&&&&&$arr2.='xxxxx';&&&&&&&&$html&=&str_replace($arr,&$arr2,$html);&&&&}}
修改(替换,添加,删除)html页面的内容,修改的是指定的app的控制器的方法的页面的html内容
因为这个service是在site_controller的构造方法里面的,因此,这个service一般是在修改系统共用的一些内容
其用法和site_controller_content这个service一样,service注册类的写法所一样的,需要注意的是service ID 的写法site_controller_content.$app_name.$ctl.$act第一个%s表示的此页面所在的app的app名字
第二个%s表示的此页面所在的调用控制器的名字
第三个%s表示的此页面所在的调用方法的名字
service类的写法modify方法:和site_controller_content service类的写法一样
boot方法:一般修改的是前台系统共用的一些配置信息,最后返回true
此service用于前台的页面劫持
使用场景:如果在一个前台控制器中使用了site_controller中page方法调用view下的html页面,
那么在需要劫持此方法中的的页面则可以使用此service
注册srevice第一个%s表示的此页面所在的app的app名字
第二个%s表示的此页面所在的调用控制器的名字
第三个%s表示的此页面所在的调用方法的名字
&service id=&site_controller_display.b2c.site_gallery.index&&
&class&shangchao_ctl_site_gallery&/class&
&/service&
service类的写法get_view方法:返回劫持后的页面
get_app_id方法: 提供劫持后的页面所在的app的名字
&?phpclass&shangchao_ctl_site_gallery&extends&site_controller{&&&&function&get_view(){&&&&&&&&//$GLOBALS['runtime']['serach_content']&=&$_GET['scontent'].'__'.$this-&pagedata['args'][5];&&&&&&&&//提供劫持页面的数据&&&&&&&&return&'site/gallery/index.html';//返回劫持的页面&&&&}&&&&function&get_app_id(){&&&&&&&&return&'shangchao';&&&&}}?&今天看啥 热点:
【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(6) 控制器基类 主要做登录用户、权限认证、日志记录等工作,mvc控制器基类继承声明:本系列为原创,分享本人现用框架,未经本人同意,禁止转载!
希望大家好好一步一步做,所有的技术和项目,都毫无保留的提供,希望大家能自己跟着做一套,还有,请大家放心,只要大家喜欢,有人需要,绝对不会烂尾,我会坚持写完~
如果你感觉文章有帮助,点一下推荐,让更多的朋友参与进来,也是对本人劳动成果的鼓励,谢谢大家!由于还要工作,所以基本都是牺牲午休时间来写博客的,写博客呢不是简单的Ctrl+C、Ctrl+V,我是要挨着做一遍的,这也是对大家负责,所以有些时候更新不及时,或者问题没有及时解答,希望大家谅解,再次感谢大家!!
因为我引用了许多以前积累的类库,所以有些东西是重复的(后来更新),有些东西是过时的,包括我写的代码,希望大家不要纯粹的复制,取其精华去其糟粕&_&。
在项目最后我会把每个部分、每个阶段的Demo提供下载给大家,其实,如果跟着做完,并且剔除掉了我代码不好的地方,你也不需要这些Demo了,是吧~
&【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(1)搭建MVC环境 注册区域
&【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(2)创建数据库和数据模型
&【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(3)公共基础数据操作类 RepositoryBase
&【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(4)对前面的一些问题汇总和总结
&【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.1) 登录功能的实现,开始接触Spring IOC、DI
【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.2) 登录功能的实现,接口注入、log4net的使用
【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.3) 登录功能的实现,丰富数据表、建立关联
【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.4) 登录功能的实现,创建与登录用户相关的接口和实现类
【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.5) 登录功能的实现,完善登录功能
今天我们来写一个控制器基类 主要做登录用户、权限认证、日志记录等工作
我们用的工具是:VS 2013 + SqlServer 2012 + IIS7.5
希望大家对ASP.NET MVC有一个初步的理解,理论性的东西我们不做过多解释,有些地方不理解也没关系,会用就行了,用的多了,用的久了,自然就理解了。
很多朋友在前几篇都遇到 根节点 的问题,我把这几个xml先给大家贴一下
WebPage/Config下面三个XML
ComControllers.xml、IndexControllers.xml
1 &?xml version="1.0" encoding="utf-8" ?&
2 &objects xmlns="http://www.springframework.net"&
&description&Spring注入控制器,容器指向Service层封装的接口&/description&
4 &/objects&
Controllers.xml
1 &?xml version="1.0" encoding="utf-8" ?&
2 &objects xmlns="http://www.springframework.net"&
&description&Spring注入控制器,容器指向Service层封装的接口&/description&
&!--系统管理 Begin--&
&!--登录控制器--&
&object type="WebPage.Areas.SysManage.Controllers.AccountController,WebPage" singleton="false"&
&property name="UserManage" ref="Service.User"/&
&!--系统管理 end--&
10 &/objects&
Service/Config下面两个XML
ComService.xml
1 &?xml version="1.0" encoding="utf-8" ?&
2 &objects xmlns="http://www.springframework.net"&
&description&Spring注入Service,容器指向本层层封装的接口,舍弃Dao层,减少代码量&/description&
4 &/objects&
Service.xml
1 &?xml version="1.0" encoding="utf-8" ?&
2 &objects xmlns="http://www.springframework.net"&
&description&Spring注入Service,容器指向本层层封装的接口,舍弃Dao层,减少代码量&/description&
&!--系统管理begin--&
&!--用户管理--&
&object id="Service.User" type="Service.ServiceImp.UserManage,Service" singleton="false"&
&!--系统管理end--&
9 &/objects&
一、我们在Controllers文件夹下新建一个控制器&BaseController, 用于控制器基类,主要做登录用户、权限认证、日志记录等工作
二、我们声明一些公共变量和容器
变量主要用于我们查询分页的时候用户传递关键字、页码和分页条数
这个用户容器 主要是用户后台用户的一些操作
#region 公用变量
/// &summary&
/// 查询关键词
/// &/summary&
public string keywords { get; set; }
/// &summary&
/// 视图传递的分页页码
/// &/summary&
public int page { get; set; }
/// &summary&
/// 视图传递的分页条数
/// &/summary&
public int pagesize { get; set; }
/// &summary&
/// 用户容器,公用
/// &/summary&
public IUserManage UserManage = Spring.Context.Support.ContextRegistry.GetContext().GetObject("Service.User") as IUserM
#endregion
三、获取当前用户对象
从Sesssion中获取用户对象,Session过期后 通过 Cookies重新获取用户对象
#region 用户对象
/// &summary&
/// 获取当前用户对象
/// &/summary&
public Account CurrentUser
//从Session中获取用户对象
if (SessionHelper.GetSession("CurrentUser") != null)
return SessionHelper.GetSession("CurrentUser") as A
//Session过期 通过Cookies中的信息 重新获取用户对象 并存储于Session中
var account = UserManage.GetAccountByCookie();
SessionHelper.SetSession("CurrentUser", account);
#endregion
四、重写控制器&OnActionExecuting(ActionExecutingContext filterContext)方法 实现登录验证和公共变量的获取
&protected override void OnActionExecuting(ActionExecutingContext filterContext)
#region 登录用户验证
//1、判断Session对象是否存在
if (filterContext.HttpContext.Session == null)
filterContext.HttpContext.Response.Write(
" &script type='text/javascript'& alert('~登录已过期,请重新登录');window.top.location='/'; &/script&");
filterContext.RequestContext.HttpContext.Response.End();
filterContext.Result = new EmptyResult();
//2、登录验证
if (this.CurrentUser == null)
filterContext.HttpContext.Response.Write(
" &script type='text/javascript'& alert('登录已过期,请重新登录'); window.top.location='/';&/script&");
filterContext.RequestContext.HttpContext.Response.End();
filterContext.Result = new EmptyResult();
21 #endregion
#region 公共Get变量
//分页页码
object p = filterContext.HttpContext.Request["page"];
if (p == null || p.ToString() == "") { page = 1; } else { page = int.Parse(p.ToString()); }
//搜索关键词
string search = filterContext.HttpContext.Request.QueryString["Search"];
if (!string.IsNullOrEmpty(search)) { keywords = }
//显示分页条数
string size = filterContext.HttpContext.Request.QueryString["example_length"];
if (!string.IsNullOrEmpty(size) && System.Text.RegularExpressions.Regex.IsMatch(size.ToString(), @"^\d+$")) { pagesize = int.Parse(size.ToString()); } else { pagesize = 10; }
12 #endregion
五、模块权限验证功能
规则:1、根据模块别名验证对应模块& & & & 2、根据模块操作Action 验证是否可操作按钮
这里我们分为两个打步骤:第一,前台按钮没有相应操作权限的,我们移除前台操作按钮。
& & & & & & & & & & & & & & & & & 第二,也是为了防止用户绕过前台验证,我们对后台模块以及方法进行验证,如果用户对相应的模块没有相应的操作权限(添加、修改、删除、审核、发布等等,包含自定义操作类型),我们拒绝执行。
网站的权限判断是一个非常普遍的需求,我们实现这样的需求只要从&AuthorizeAttribute&集成,重写相关的判断逻辑
我们新建一个权限验证类UserAuthorizeAttribute 继承&AuthorizeAttribute (关于AuthorizeAttribute&点击这里)
public class UserAuthorizeAttribute : AuthorizeAttribute
我们对添加一个自定义的Attribute,通过AttributeUsage的Attribute来限定Attribute 所施加的元素的类型
作为参数的AttributeTarges的值允许通过&或&操作来进行多个值得组合,如果你没有指定参数,那么默认参数就是All 。
AttributeUsage除了继承Attribute 的方法和属性之外,还定义了以下三个属性:
AllowMultiple: 读取或者设置这个属性,表示是否可以对一个程序元素施加多个Attribute 。
Inherited:读取或者设置这个属性,表示是否施加的Attribute 可以被派生类继承或者重载。
ValidOn: 读取或者设置这个属性,指明Attribute 可以被施加的元素的类型。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class UserAuthorizeAttribute : AuthorizeAttribute
添加一些字段和属性,并且实例化基类
#region 字段和属性
/// &summary&
/// 模块别名,可配置更改
/// &/summary&
public string ModuleAlias { get; set; }
/// &summary&
/// 权限动作
/// &/summary&
public string OperaAction { get; set; }
/// &summary&
/// 权限访问控制器参数
/// &/summary&
private string Sign { get; set; }
/// &summary&
/// 基类实例化
/// &/summary&
public BaseController baseController = new BaseController();
19 #endregion
我们重写 AuthorizeAttribute 的&OnAuthorization(AuthorizationContext filterContext)方法
/// &summary&
/// 权限认证
/// &/summary&
public override void OnAuthorization(AuthorizationContext filterContext)
分为四步:
1、判断模块是否对应
2、判断用户是否存在
3、调用下面的方法,验证是否有访问此页面的权限,查看加操作
4、有权限访问页面,将此页面的权限集合传给页面
//1、判断模块是否对应
if (string.IsNullOrEmpty(ModuleAlias))
filterContext.HttpContext.Response.Write(" &script type='text/javascript'& alert('^您没有访问该页面的权限!'); &/script&");
filterContext.RequestContext.HttpContext.Response.End();
filterContext.Result = new EmptyResult();
//2、判断用户是否存在
if (baseController.CurrentUser == null)
filterContext.HttpContext.Response.Write(" &script type='text/javascript'& alert('^登录已过期,请重新登录!');window.top.location='/'; &/script&");
filterContext.RequestContext.HttpContext.Response.End();
filterContext.Result = new EmptyResult();
      //对比变量,用于权限认证
var alias = ModuleA
#region 配置Sign调取控制器标识
Sign = filterContext.RequestContext.HttpContext.Request.QueryString["sign"];
if (!string.IsNullOrEmpty(Sign))
if (("," + ModuleAlias.ToLower()).Contains("," + Sign.ToLower()))
filterContext.Controller.ViewData["Sign"] = S
#endregion
//3、调用下面的方法,验证是否有访问此页面的权限,查看加操作
var moduleId = baseController.CurrentUser.Modules.Where(p =& p.ALIAS.ToLower() == alias.ToLower()).Select(p =& p.ID).FirstOrDefault();
bool _blAllowed = this.IsAllowed(baseController.CurrentUser, moduleId, OperaAction);
if (!_blAllowed)
filterContext.HttpContext.Response.Write(" &script type='text/javascript'& alert('您没有访问当前页面的权限!');&/script&");
filterContext.RequestContext.HttpContext.Response.End();
filterContext.Result = new EmptyResult();
//4、有权限访问页面,将此页面的权限集合传给页面
filterContext.Controller.ViewData["PermissionList"] = GetPermissByJson(baseController.CurrentUser, moduleId);
上面主要是对后台控制器方法操作权限的验证,有时候前台展示了比如 添加、删除功能,但是用户去操作的时候后台验证不通过会提示用户没有操作权限,这样显得不是很友好,我们返回个权限Json,前台按钮没有这个权限的我们就移除掉
/// &summary&
/// 获取操作权限Json字符串,供视图JS判断使用
/// &/summary&
string GetPermissByJson(Account account, int moduleId)
//操作权限
var _varPerListThisModule = account.Permissions.Where(p =& p.MODULEID == moduleId).Select(R =& new { R.PERVALUE }).ToList();
return Common.JsonConverter.Serialize(_varPerListThisModule);
/// &summary&
/// 功能描述:判断用户是否有此模块的操作权限
/// &/summary&
bool IsAllowed(Account user, int moduleId, string action)
//判断入口
if (user == null || user.Id &= 0 || moduleId == 0 || string.IsNullOrEmpty(action)) return false;
//验证权限
var permission = user.Permissions.Where(p =& p.MODULEID == moduleId);
action = action.Trim(',');
if (action.IndexOf(',') & 0)
permission = permission.Where(p =& action.ToLower().Contains(p.PERVALUE.ToLower()));
permission = permission.Where(p =& p.PERVALUE.ToLower() == action.ToLower());
return permission.Any();
/// &summary&
/// 模型去重,非常重要
/// add yuangang by
/// &/summary&
public class ModuleDistinct : IEqualityComparer&Domain.SYS_MODULE&
public bool Equals(Domain.SYS_MODULE x, Domain.SYS_MODULE y)
return x.ID == y.ID;
public int GetHashCode(Domain.SYS_MODULE obj)
return obj.ToString().GetHashCode();
后面,我们就用到这个基类,我先给大家看一下这个权限认证在后台是如何使用的,加上这一句就OK了
原创文章 转载请尊重劳动成果&
暂无相关文章
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&
Asp.Net教程最近更新

我要回帖

更多关于 ios 基类视图控制器 的文章

 

随机推荐