0

0

控制器基类

php中文网

php中文网

发布时间:2016-07-25 08:47:57

|

1567人浏览过

|

来源于php中文网

原创

非常简单实用的控制器基类
  1. /**
  2. * @desc 控制器基类
  3. * @date 2013-05-06
  4. * @author liudesheng
  5. */
  6. defined('SYS_PATH') || die('访问非法');
  7. class controller
  8. {
  9. //当前控制器
  10. protected $_controller;
  11. //当前动作方法
  12. protected $_action;
  13. //权限数组
  14. protected $_permissions;
  15. //模板文件
  16. private $_layout = 'layout';
  17. //构造函数
  18. function __construct($controller,$action)
  19. {
  20. if('exception' != $controller){
  21. $this->_controller = $controller;
  22. $this->_action = $action;
  23. //登录检查和访问权限控制部分,登录页不需要验证
  24. $trust_action = util::c('trust_action');
  25. if(!isset($trust_action[$this->_controller]) || !in_array($this->_action,$trust_action[$this->_controller])){
  26. $this->login();
  27. //$this->privilege();
  28. }
  29. $this->init();
  30. }else{//异常处理
  31. $this->exception($action);
  32. }
  33. }
  34. //初始化方法,用于继承操作
  35. protected function init(){}
  36. //异常处理方法
  37. private function exception($msg)
  38. {
  39. $this->showErr($msg,$layout);
  40. }
  41. //验证登录
  42. private function login()
  43. {
  44. if(!$this->isLogin()){
  45. if($this->isAjax()){
  46. header('HTTP/1.1 403 Forbidden');
  47. header("Error-Json:{code:'login'}");
  48. exit();
  49. }else{
  50. $this->redirect('index','login');
  51. }
  52. }
  53. }
  54. //判断是否登录
  55. protected final function isLogin()
  56. {
  57. $auth = isset($_COOKIE['auth'])?$_COOKIE['auth']:'';
  58. $isLogin = false;
  59. if($auth){
  60. $info = trim(file_get_contents('check.txt'));
  61. if(strcmp($auth,md5('steve'.$info.util::c('login_auth_suffix'))) == 0){
  62. $isLogin = true;
  63. }
  64. }
  65. return $isLogin;
  66. }
  67. //验证权限
  68. private function privilege()
  69. {
  70. $this->getPermissions();
  71. if(!$this->isAllow()){
  72. if($this->isAjax()){
  73. header('HTTP/1.1 403 Forbidden');
  74. header( "Error-Json:{code:'access'}");
  75. exit();
  76. }else{
  77. $this->showErr('对不起,您没有此权限');
  78. }
  79. }
  80. }
  81. //获取权限信息
  82. protected final function getPermissions()
  83. {
  84. $privilege = $this->admin['privilege'];
  85. $permissions_priv = util::c('permissions',$privilege);
  86. if(!isset($permissions_priv['city'])){
  87. $this->cityPriv = 'all'; //为了简化列表查询,方便以后可能添加所有城市权限选择
  88. }else{
  89. unset($permissions_priv['city']);
  90. }
  91. foreach($permissions['common'] as $ct => $ac){
  92. if(isset($permissions_priv[$ct]) && 'all' == $permissions_priv[$ct])
  93. continue;
  94. if('all' == $ac)
  95. $permissions_priv[$ct] = 'all';
  96. else //这种情况必须是数组,节省资源,不做判断了
  97. $permissions_priv[$ct] = isset($permissions_priv[$ct])?array_merge($permissions_priv[$ct],$ac):$ac;
  98. }
  99. $this->_permissions = $permissions_priv;
  100. }
  101. //根据权限类型判断是否有权限
  102. protected final function isAllow($controller='',$action='')
  103. {
  104. if(!isset($this->_permissions))
  105. $this->getPermissions();
  106. $allow = false;
  107. $ct = $controller?$controller:$this->_controller;
  108. $ac = $action?$action:$this->_action;
  109. $permission_action = $this->_permissions[$ct];
  110. if($permission_action && ('all' == $permission_action || in_array($ac,$permission_action) || 'any' == $action))
  111. $allow = true;
  112. return $allow;
  113. }
  114. //错误信息页面
  115. protected function showErr($errMsg,$layout = null)
  116. {
  117. $this->title = "错误提示";
  118. $this->errMsg = $errMsg;
  119. $this->render('error',$layout);
  120. }
  121. //成功信息页面
  122. protected function showSucc($msg,$skipUrl,$skipPage,$layout = null)
  123. {
  124. $this->title = "成功提示";
  125. $this->msg = $msg;
  126. $this->skipUrl = $skipUrl;
  127. $this->skipPage = $skipPage;
  128. $this->render('success',$layout);
  129. }
  130. //显示有权限的链接
  131. protected function showPemissionLink($title,$ct,$ac,$param=array(),$wrap='')
  132. {
  133. if($wrap){
  134. $wrap_start = '';
  135. $wrap_end = ''.$wrap.'>';
  136. }else{
  137. $wrap_start = $wrap_end = '';
  138. }
  139. if($this->isAllow($ct,$ac))
  140. echo $wrap_start,'',$title,'',$wrap_end;
  141. }
  142. //视图解析方法
  143. protected function render($template = null,$layout = null)
  144. {
  145. !is_null($layout) && $this->_layout = $layout;
  146. !$template && $template = $this->_controller.'_'.$this->_action;
  147. ob_start();
  148. include(MODULE_PATH.'views/'.$this->_layout.'.tpl.php');
  149. $content = ob_get_clean();
  150. if($this->staticFile){
  151. file_put_contents($this->staticFile,$content);
  152. }
  153. echo $content;
  154. exit;
  155. }
  156. protected function showHtml($html,$expire=3600,$path='')
  157. {
  158. empty($path) && $path=ROOT_PATH;
  159. $this->staticFile = sprintf('%s%s.html',$path,$html);
  160. $mkhtml = intval($this->_G('mkhtml'));
  161. if(!$mkhtml){
  162. if(file_exists($this->staticFile)){
  163. $fmtime = filemtime($this->staticFile);
  164. if(time()-$fmtime
  165. include $this->staticFile;
  166. exit;
  167. }
  168. }
  169. }
  170. }
  171. //生成url
  172. protected function url($ct='',$ac='',$param = array(),$module='')
  173. {
  174. return $GLOBALS['app']->url($ct,$ac,$param,$module);
  175. }
  176. //url跳转
  177. protected function redirect($ct='',$ac='',$param = array())
  178. {
  179. header('location:'.$this->url($ct,$ac,$param));
  180. exit();
  181. }
  182. //url跳转
  183. protected function redirectUrl($url)
  184. {
  185. header('location:'.$url);
  186. exit();
  187. }
  188. //获取back redirect url
  189. protected function getBru()
  190. {
  191. return $_COOKIE[util::c('bru_cookie_name')]?$_COOKIE[util::c('bru_cookie_name')]:$this->url();
  192. }
  193. //是否是ajax请求
  194. protected function isAjax()
  195. {
  196. if(isset( $_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
  197. return true;
  198. return false;
  199. }
  200. //返回json数组
  201. protected function returnJson($data)
  202. {
  203. echo json_encode($data);
  204. exit();
  205. }
  206. //GET
  207. protected function _G($name)
  208. {
  209. return isset($_GET[$name])?util::sanitize($_GET[$name]):'';
  210. }
  211. //POST
  212. protected function _P($name)
  213. {
  214. if(!isset($_POST[$name]) || (is_string($_POST[$name]) && mb_strpos($_POST[$name],'请输入',0,'gbk') === 0)){
  215. return '';
  216. }else{
  217. return util::sanitize($_POST[$name]);
  218. }
  219. }
  220. //REQUEST
  221. protected function _R($name)
  222. {
  223. return isset($_REQUEST[$name])?util::sanitize($_REQUEST[$name]):'';
  224. }
  225. }
复制代码


热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

797

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

272

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

144

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

25

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

92

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

53

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

15

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

717

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

64

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2.1万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1万人学习

进程与SOCKET
进程与SOCKET

共6课时 | 0.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号