ThinkPHP-控制器

1、控制器操作

1、控制器操作
第一步:控制器默认创建在当前模块下的Controller目录下
第二步:按照指定的命名规则:控制器名(首字母大写)+controller.class.php
第三步:控制器里的方法必须是public公共的
//控制器
class UserController extends Controllr(){
       public function index(){
            //index()方法在URL访问时可以忽略
     }
}
URL访问:http:localhost/demo/User/index/
有时方法名可能和关键字冲突,那么定义起来就比较麻烦,控制器提供了一个配置定义:
//配置控制器方法后缀
‘ACTION_SUFFIX’=>Action,
//每个方法后面加上Action ,对于URL访问不需要加Action
class UserController extends Controllr(){
       public function indexAction(){
            //index()方法在URL访问时可以忽略
     }
}
默认情况下通过URL访问的页面是控制器模块下的方法,即:controller目录下的UserController.class.php类,他是对外公开可访问的,我们可以成为访问控制器,那么很多时候,由于项目业务的高度繁杂,我们可能想法法很多业务分离到另外的层,比如事件控制层,那么可以这么操作
第一步:创建时间控制器目录:Event
第二步:创建UserEvent.class.php类
//是否继承控制器基类或者其他的类,取决于你的业务
class UseEvent extends Controller{
       public  function test(){
              echo  '这是事件控制器层的封装,不对外公开,属于内部调用'
       }
}
在其他对外公开的类里面进行调用可以输出
class UserController extends Controllr(){
       public function test(){
            $userEvent = new UserEvent();
             $userEvent->test();
            echo 'test';
     }
}
PS:这里调用别的控制器还可以使用快捷键调用方法A()。
$userEvent = A('User' , 'Event');
$userEvent = A('Admin/User' , 'Event');   //增加模块

默认情况下,控制器只支持一级控制器,当项目较为复杂的时候,想创建同意模块下多个控制器时,可以配置二级控制器
第一步:配置允许二级控制器
//允许配置二级控制器
‘CONTROLLR_LEVEL’=>2
第二步:在Controller目录下创建User目录,在User目录下创建一个控制器,
//二级控制器写法
namespace Home\Controller\User
user Think\Controller;
class MemberController extends Controller{
        public  function index(){
             echo '多级控制器'
        }
}
ThinkPHP 控制器还提供了两个特殊的方法目前只操作方法_before_index()和后置操作方法_after_index()这两个方法,在控制器调用index()方法的时候,一个在之前执行,一个在之后执行
public function  _before_index(){
      //在之前执行
}
public function  _after_index(){
      //在之前执行
}

2、Action参数绑定

参数绑定是通过直接绑定URL地址中的变量作为操作方法的参数,可以简书方法的定义甚至路由的解析
//启动Action参数绑定,默认为true,可以不写
‘URL_PARAMS_BIND’=>true
//变量名为$id
class UserController extends Controller{
        public  function   index($id){
                   echo  'id:'.$id;
        }
}
URL  http://localhost/demo/index/id/3
PS:当你URL没有传递参数(id/4)的时候,那么页面会报错,参数错误或者未定义:id  当然如果取消绑定,则不会报错‘URL_PARAMS_BIND’=>false   但是,为了程序的严谨性,一般需要要取消参数绑定
   如果你那个参数设定一个默认值,当没有传递参数的时候,慧直接启用默认值,
//给变量$id  设置默认值
public  function  index($id=1)

还有一种是按顺序传递参数,这个方法可以省略掉键值对中的键,也就是说id不需要传递,只需要传递5这个值即可,但必须按照多个参数的顺序
//定义按照顺序传参绑定
‘URL_PARAMS_BIND_TYPE’=>1
//传递两个参数
class UserContrroller extends Controller(){
         public  function  index($id ,$type){
                 echo   'id:' . $id . ' type:'  .$type;
          }
}

3、跳转与重定向

ThinkPHP在操作数据库时,需要跳转和重定向页面,ThinkPHP提供了一组方法来解决了这个问题
//成功和失败的跳转
class UserController  extends  Controller{
        public  function  index(){
             $flag = true;
             if($flag){
                       //会跳转到:http://localhost/demo/User/all
                    $this->success('新增成功' , ‘../User/all’);
              }else{
               //会跳转到本页的上一页
               $this->error('新增失败')
               }
        }
}
PS:success()方法和error()方法,第一个参数是提示信息,第二个跳转的地址、第三个跳转时间、默认情况下success()方法是1秒,error()方法是3秒
//设置5秒
$this->success('新增成功' , 'list'  , 5);
success()方法和error()方法,跳转的时候就对应了相应的末班吗,默认如下:
//默认错误跳转对应的模板文件
‘TMPL_ACTION_ERROR’=>THINK_PATH    .'Tpl/dispatch_jump.tpl'
//默认成功跳转对应的模板文件
‘TMPL_ACTION_SUCCESS’=>THINK_PATH    .'Tpl/dispatch_jump.tpl'

//自定义成功和错误提示模板页面 公共的配置文件中写
'TMPL_ACTION_SUCCESS'=>'Public/sucess',
‘TMPL_ACTION_ERROR’=>'Public/error',

对于自定义的提示模板,ThinkPHP提供了一组变量可供使用
//直接在自定义的模板中使用这些变量。
$msgTitle     操作标题
$message       页面提示信息
$status             操作状态1  表示成功0   表示失败
$waitSecond        跳转等待时间  单位为妙
$jumpUrl        跳转页面地址

PS:如果对于数据库操作,采用了Ajax,那么success()和error()会自动ajaxReturn()方法返回数据提供调用
ThinkPHP还单独提供了重定向方法redirect(),参数和U()方法一样,这个方法使用的URL规则
$this->redirect(‘User/test’ , arrar('id'=>5) , 5 , '页面跳转中。。。');

//如果只是想纯粹的URL跳转 ,不去使用URL规则 ,那么直接使用redirect()函数,
redirect('http://www.baidu.com' , 5 , '页面跳转中。。');

4、输入变量

我们在获取系统变量或者用户提交的数据时,这些变量数据错综复杂,一不小心就容易引擎安全隐患,所以,ThinkPHP提供 了轻松和安全取变量的解决方案。
//常规获取变量方式
$id = $_GET['id'];     //获取get变量
$name = $_POST['name']   //获取post变量
$value = $_SESSIONM['var'];    //获取session变量
$name = $_COOLIE['name'];    //获取cookie变量
$file = $_SERVER['PHP_SELF'];    //获取server变量

PS:在ThinkPHP中,我们不在建议直接使用传统方式获取,因为没有统一的安全处理机制,后期调整也会比较麻烦,所以ThinPHP提供I()方法进行变量的获取和过滤。
I()方法的格式:I(‘变量类型,变量名’ ,['默认值'] ,[‘过滤方法’])
get     获取GET参数
post     获取POST参数
param    自动判断请求类型获取GET   POST  或者PUT参数
request    获取REUQUEST
put        获取PUT参数
session     获取$_SESSION参数
cookie    获取$_COOKIE参数
server     获取$_SERVER参数
globals    获取$_GLOBALS参数

//获取$_GET['id'];
echo I('get.id');
//$_GET['id']没有值  则默认1
echo  I('get.id' , 1);
//过滤$_GET['id'];
echo  I('get.id' , '' , 'md5');
//获取$_GET;
print_r(I('get .'));
PS:其他几个系统变量均采用以上方式

ThinkPHP还提供了一个自动识别各种系统变量类型的接受方法:param
//param变量自动判断变量类型
echo I('param.id');
//param可以省略
echo I('id');

如果是PATHINFO模式的URL  param也可以接受
//param获取URL所有参数
print_r(I('param.0'));

PS:取消和开启URL的URL_PARAM_BIND_TYPE=>1配置定义,在访问这个URL得时候结果有所不同,
关闭URL传参顺序:Array([id] = 5 [type] => a)
开启URL传参顺序:Array([0]=>id[1]=>5[2]=>type[3]=>a)

//param获取指定参数值
echo I('param.id');
echo I('param.type');

默认情况下  IO的默认过滤是:htmlspecialchars,过滤掉HTML
//过滤HTML  如果去掉了,则传递包含html的字符串,将不过滤
‘DEFAULT_FILTER’=>'htmlspecialchars'

当然如果不过滤,也可以在程序中过滤
//设置过滤函数,会忽略配置文件里的配置
echo  I('get.id' , '' , 'htmlspecialchars');

如果系统设置了默认的过滤,本身某个函数又不想过滤那么可以这么处理
//设置屏蔽系统默认过滤 
echo  I('get.id' , '' ,false);  //第三参数为空字符串均可

5、请求类型

ThinkPHP提供了一组常量来判断当前请求是否是GET/POST等。通过判断请求处理不同的业务逻辑
IS_GET    判断是否GET提交请求
IS_POST    判断是否POST提交请求
IS_PUT    判断是否PUT提交请求
IS_DELTE  判断是否DELTE提交请求
IS_AJAX   判断是否AJAX提交请求

//判断是不是GET请求
if(IS_GET){
  echo  '是GET请求'
}else{
   echo   ‘不是GET请求’
}

6、空操作

空操作是指系统在找不到请求的操作方法时,慧定位到空操作(_empty)方法来执行。利用这个机制,我们可以实现错误页面和一些URL的优化
//如果没有相关方法则执行
public  function  _empty(){
    //连接符 .  
   //方法名  ACTION_NAME
    echo ‘找不到’ .ACTION_NAME.方法
}

7、空控制器

所谓空控制器,就是请求不到指定控制器时,调用一个专门的空控制器,利用这个机制,我们可以实现错误页面和一些URL的优化
//如果没有相关控制器则执行
class  EmptyController  extends  Controller{
       public  function  index(){
           echo  '找不到控制器' . CONTROLLER_NAME;
       }
}

8、操作绑定到类
项目大的时候可以用到这功能。

TinkPHP提供了把每个操作方法定位到一个类的功能,即每个吧层次分的更加细腻
//设置操作绑定到类
‘ACTION_BINGD_CALSS’=>Ture

然后,在Controller目录下简历User目录,在User目录下简历index.class.php  再建立test.class.php
//index.class.php
namespace  Home\Controller\User;
user Think\Controller

class index extends Controller(){
        public function  run(){
         echo  'User模块下的index类'
          }
}

//test.class.php
namespace  Home\Controller\User;
user Think\Controller

class test extends Controller(){
        public function  run(){
         echo  'User模块下的test类'
          }
}

//空控制器 可以创建一个目录_empty 然后建立index.class.php
//空控制器
namespace  Home\Controller\_empty;
user Think\Controller

class index extends Controller(){
        public function  run(){
         echo  '找不到' .CONTROLLER. ‘控制器的’ .ACTION_NAME. '方法';
          }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容

  • 多层控制器的使用 TP3.23对控制器做了更加细致的分层,除了默认的Controller层,还可以自定义事件控制层...
    阿V薄荷加可乐阅读 1,449评论 2 3
  • 5个属性 1.试图类实例对象:protected $view;2.请求类实例对象:protected $reque...
    PlusNie阅读 1,284评论 2 5
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,099评论 18 139
  • 一、写在前面 这几天准备写控制器中输出模板的方法display,但在阅读源码的时候遇到了一点问题。整个源码我看了一...
    阿V薄荷加可乐阅读 510评论 0 0
  • Babybus-u3d技术交流-移动平台动态读取外部文件全解析 [ 移动平台动态读取外部文件全解析 前言: 一直有...
    Babybus_Unity阅读 876评论 0 1