美文网首页
ThinkPHP-控制器

ThinkPHP-控制器

作者: 慢慢来111 | 来源:发表于2017-03-08 17:46 被阅读210次

    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. '方法';
              }
    }
    
    

    相关文章

      网友评论

          本文标题:ThinkPHP-控制器

          本文链接:https://www.haomeiwen.com/subject/hugmgttx.html