thinkphp5学习笔记(四)控制器

控制器类 Controller.php

1.五个属性
    * 视图类实例对象:protected $view;
    * 请求类实例对象:protected $request;
    * 验证失败是否抛出异常:protected $failException = false;
    * 是否批量验证:protected $batchValidate = false;
    * 前置方法列表:protected $beforeActionList = [];
2.八个方法
    * 构造方法:public function __construct($Request $request = null)
    * 初始化方法:protected function _initialize(){} //默认为空
    * 加载模板:proctected function fetch($template="",$vars=[],$replace=[],$config=[])
    * 渲染内容:protected function display($content="",$vars=[],$replace=[],$config=[])
    * 模板变量赋值:protected function assign($name,$value="")
    * 初始化模板引擎:protected function engine($engine)
    * 验证失败抛出异常:protected function validateFailException($fail=true)
    * 验证数据:protected function validate($data,$validate,$message=[],$batch=false,$callback=null)
3.可访问控制器
    *  'url_controller_layer'   => 'controller',    // 默认的访问控制器层
4.可访问操作
    * 访问限制符 public
5.命名空间,它与控制器或方法后缀的关系
    *  'controller_suffix'      => false,    // 控制器类后缀
    *  'action_suffix'          => '',   // 操作方法后缀
    *  'url_convert'            => true,// 是否自动转换URL中的控制器和操作名
    *  UserLogin类访问时 user_login
6.自定义访问控制器层
    * 'url_controller_layer'   => 'controller',    // 默认的访问控制器层
7.创建多级控制器
    * 目录 application\index\controller\user
    * 命名空间 namespace app\index\controller\user;下创建 Demo.php
    * 访问:tp5.com/index/user.demo/index
8.创建空操作和空控制器
    * 在控制器中创建空操作
        public function _empty($method){
            return '你访问的方法'.$method.'不存在';
        }
    * 创建空的控制器
          'empty_controller'   => 'Error',    // 默认的空控制器名
          在application\index\controller 下创建error控制器
          <?php
                namespace app\index\controller;
                class Error
                {
                    public function test()
                    {
                        return '空控制器的方法';
                    }
                    //空控制器中的空操作
                    public function _empty($method){
                        return '你访问的方法'.$method.'不存在';
                    }
                }
9.在控制器中使用trait有什么好处
    * 在没有继承父类controller 又想使用它里面的方法时 使用 use\traits\controller\Jump;引入。
10.什么是单一模块?什么时候需要使用它?
    * 配置:'app_multi_module'  =>  false, // 关闭多模块设计
    * 目录 application\controller
    * 命名空间  namespace app\controller; 创建Index.php
    * 访问:tp5.com\index\demo
    * 单模块下 在controller目录下创建admin和home目录完成多级控制器

公共操作与公共类

1.公共操作用及创建公共操作
    * 构造方法通常是公共的
    <?php
        namespace app\index\controller;
        class Index extends \think\Controller  //继承controller类
        {
            protected $lession;
            /*public function __construct($lession='thinkphp5')
            {
                $this->lesssion = $lession;
            }
            public function demo1()
            {
                return (new self('php'))->lession;
            }*/
            public function _initialize($lession='thinkphp5')
            {
                $this->lesssion = $lession;
            }
            public function demo1()
            {
                $this->_initialize('php');  //调用方法
                return $this->lession;
            }
            public function demo2()
            {
                return $this->lession;
            }
        }
2.公共控制器类 Base.php
    * class Index extends Base{}
3.控制器中的公共操作,解决了类中数据共享以及属性初始化的问题。
4.公共控制器,从控制器层面上,解决了控制器类之间的属性和方法的共享问题。

控制器前置操作

1.什么是前置操作
2.为什么必须继承基类Controller,才能创建前置操作
    * 第一步:创建前置操作方法
    * 第二步:配置前置操作列表
    <?php
        namespace app\index\controller;
        protected $beforeActionList = [     //前置方法列表,继承自Controller
            'before1'=>'',      //为空,表示before1是当前类中的全部操作的前置操作
            //'before2'=>['only'=>'demo2'],   //仅对demo2有效
            'before2'=>['except'=>'demo2'],   //排除法,对demo2之外的操作有效

        ];
        protected $siteName;    //自定义属性
        protected function before1()
        {
            //$this->siteName = 'php';
            $this->siteName = $this->request->param('name');
        }
        protected function before2()
        {
            $this->siteName = "php1";
        }
        public function demo1()
        {
            return $this->siteName;
        }
        public function demo2()
        {
            return $this->siteName;
        }
        public function demo3()
        {
            return $this->siteName;
        }
3.前置操作有什么用,如何使用?构造方法可以看做是类的前置操作

页面跳转与重定向

1.页面跳转(必须继承基类Controller)
    * 调用方法: $this->success('提示','地址'); 和 $this->eroor('提示','地址');
    * 1.当前控制器 2.跨控制器 3.跨模块 4.外部地址(必须用协议开头)
        eg:$this->success('成功','demo/login/ok');
        eg:$this->success('成功',\think\Url::build('demo/login/ok'));
        eg:$this->success('成功',url('demo/login/ok')); //助手函数url
2.重定向
    * 调用方法:$this->redirect('路由地址',[变量列表],'后缀','域名开关');//路由地址,请求变量,后缀,是否显示域名
    * 1.站内地址 2.外部地址
        eg: $this->redirect('ok',['sitename'=>'php']);
        eg: $this->redirect('http://www.baidu.com','302');  //302是临时重定向 301是永久重定向

请求对象与参数绑定

1.请求变量与请求对象的关系
    public function demo($id = '',$name='')
    {
        $request = \think\Request::instance();
        dump($request->get());  //
    }
2.$request->param();可有获取post、get的参数  $request->has('name'); //判断是否存在某个变量,返回布尔值
3.postman 模式数据  在Params -> body -> x-www-form-urlencoded 下输入参数
4.请求信息包括:
    * $request->domain();  //域名
    * $request->url();  //获取url,不包括域名
    * $request->url(true);  //获取url,包含域名
    * $request->pathinfo();  //获取url,一直到最后
    * $request->path();  //获取url,一直到最后但不包含后缀
    * $request->ext();  //获取后缀
    * $request->module();  //获取模块
    * $request->controller();  //获取控制器
    * $request->action();  //获取方法
    * $request->action('test');  //可以重新设置
    * $request->method();  //请求类型
    * $request->ip();  //
    * $request->only('id');  //只获取变量id的值
    * $request->except('id');  //只获取除变量id的以外值
5.顺序绑定参数
    * convention.php中 'url_param_type'=>0,  //0表示按成对解析,1表示按顺序解析
7.$request->param();只能获取url中的数据,不能获取方法中变量的默认值

请求对象的属性注入和方法注入

1.属性注入:\think\Request::instance()->属性
2.方法注入:\think\Request::hook('方法','对应函数')
3.作用:给当前请求对象绑定属性和方法,请求对象在应用的整个生命周期内都是有效的,不仅可以
    被当前所有控制器方法所共享,还可以跨控制器和模块进行调用。
    eg:同一个控制器中跨操作共享 Index.php
    public function demo1($name)
    {
        return $this->request->param('name');
    }
    public function demo1($name)
    {
        return $this->request->param('name');
    }

跨控制器和跨模块共享

    * 给请求对象注入的自定义属性和方法,与原请求对象中的属性和方法是同级的,所以在整个
        应用的生命周期内都是有效的。
    * 请求对象的属性方法注入写入到common.php中
        <?php
            use think\Request;
            $request = Request::instance();
            //请求对象的属性注入
            $request->siteName = "php";
            //请求对象的方法注入 绑定的第一个参数必须Request类型的变量
            function getSiteName(Request $request)
            {
                return $request->siteName
            }
            //注册请求对象的方法,也叫钩子
            Request::hook('getName','getSiteName');
    * 在Index.php中访问
        public function demo1($name)
        {
            return $this->request->siteName;
        }
        public function demo1($name)
        {
            return $this->request->getName();
        }
    * 请求对象的属性与方法注入,不仅可以扩展请求对象的功能,实现在整个应用周期的信息共享,
        而且它还可以为自定义请求的行为指定标准。

对象变量的依赖注入

1.依赖注入:改变了使用对象前,必须先创建对象的传统方式,而是从外部注入所依赖的对象。
2.thinkphp5依赖注入主要是指把对象注入到可访问控制器
3.注入方式:控制器的构造方法和操作方法
4.实现方式:对参数进行对象类型约束则会自动触发依赖注入,自动实例化该对象
5.访问控制器的参数都来自于URL请求
    * 普通变量 -> 参数绑定(按名称或顺序绑定) -> 操作方法(构造方法或普通操作)
    * 对象变量 -> 依赖注入(通过类型约束自动实例化绑定) -> 操作方法(构造方法或普通操作)
    <?php
        namespace app\index\controller;
        use think\Request;
        class Index
        {
            protected $request;
            public function __construct(Request $request)
            {
               $this->request = Request::instance();
            }
            /*public function demo1(Request $request) //依赖注入
            {
                return $request->param('lession');
            }*/
            public function demo2()
            {
                return $this->request->param('lession');
            }
        }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,596评论 18 139
  • 5个属性 1.试图类实例对象:protected $view;2.请求类实例对象:protected $reque...
    PlusNie阅读 1,314评论 2 5
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,573评论 18 399
  • 二十五 在熹微的晨光中醒来,夕瑶看看手里依然紧握的手机,她知道自己欠东平一个解释。她也知道了坦率是最好的方式。 终...
    李沐遥阅读 286评论 2 1
  • 安静的夜 是该用来思考 还是用来入睡? 一个在忙碌中获得,一个在惬意中失去。 晚,安?
    Scar乱世嘉人阅读 381评论 0 1