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控制器
            false, // 关闭多模块设计
    * 目录 application\controller
    * 命名空间  namespace app\controller; 创建Index.php
    * 访问:tp5.com\index\demo
    * 单模块下 在controller目录下创建admin和home目录完成多级控制器

公共操作与公共类

1.公共操作用及创建公共操作
    * 构造方法通常是公共的
    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,才能创建前置操作
    * 第一步:创建前置操作方法
    * 第二步:配置前置操作列表
    '',      //为空,表示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中
        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请求
    * 普通变量 -> 参数绑定(按名称或顺序绑定) -> 操作方法(构造方法或普通操作)
    * 对象变量 -> 依赖注入(通过类型约束自动实例化绑定) -> 操作方法(构造方法或普通操作)
    request = Request::instance();
            }
            /*public function demo1(Request $request) //依赖注入
            {
                return $request->param('lession');
            }*/
            public function demo2()
            {
                return $this->request->param('lession');
            }
        }

你可能感兴趣的:(thinkphp5学习笔记(四)控制器)