• tp5框架知识点


    项目包含的关键点,后台,前台。

    入口文件。

    通用配置文件。

    数据库配置文件。

    共有文件,css,images,js。

    控制器,模型,视图。

    共有类。

    共有函数。

    属性,方法。

    命名规范。

    命名空间。

    自动加载。

    数据库操作。

    基本查询

    查询一个数据使用:

    // table方法必须指定完整的数据表名
    Db::table('think_user')->where('id',1)->find();
    
    

    find 方法查询结果不存在,返回 null

    查询数据集使用:

    Db::table('think_user')->where('status',1)->select();
    
    

    select 方法查询结果不存在,返回空数组

    如果设置了数据表前缀参数的话,可以使用

    Db::name('user')->where('id',1)->find();
    Db::name('user')->where('status',1)->select();
    
    

    如果你的数据表没有使用表前缀功能,那么name和table方法的一样的效果。

    findselect方法之前可以使用所有的链式操作方法。

    默认情况下,find和select方法返回的都是数组。

    助手函数

    系统提供了一个db助手函数,可以更方便的查询:

    db('user')->where('id',1)->find();
    db('user')->where('status',1)->select();
    

    添加一条数据

    使用 Db 类的 insert 方法向数据库提交数据

    $data = ['foo' => 'bar', 'bar' => 'foo'];
    Db::table('think_user')->insert($data);
    
    
    

    如果你在database.php配置文件中配置了数据库前缀(prefix),那么可以直接使用 Db 类的 name 方法提交数据

    Db::name('user')->insert($data);
    
    

    insert 方法添加数据成功返回添加成功的条数,insert 正常情况返回 1

    添加数据后如果需要返回新增数据的自增主键,可以使用getLastInsID方法:

    Db::name('user')->insert($data);
    $userId = Db::name('user')->getLastInsID();
    
    

    或者直接使用insertGetId方法新增数据并返回主键值:

    Db::name('user')->insertGetId($data);
    
    

    insertGetId 方法添加数据成功返回添加数据的自增主键

    添加多条数据

    添加多条数据直接向 Db 类的 insertAll 方法传入需要添加的数据即可

    $data = [
        ['foo' => 'bar', 'bar' => 'foo'],
        ['foo' => 'bar1', 'bar' => 'foo1'],
        ['foo' => 'bar2', 'bar' => 'foo2']
    ];
    Db::name('user')->insertAll($data);
    
    

    insertAll 方法添加数据成功返回添加成功的条数

    助手函数

    // 添加单条数据
    db('user')->insert($data);
    
    // 添加多条数据
    db('user')->insertAll($list);
    

    更新数据表中的数据

    Db::table('think_user')
        ->where('id', 1)
        ->update(['name' => 'thinkphp']);
    
    

    如果数据中包含主键,可以直接使用:

    Db::table('think_user')
        ->update(['name' => 'thinkphp','id'=>1]);
    
    

    update 方法返回影响数据的条数,没修改任何数据返回 0

    如果要更新的数据需要使用SQL函数或者其它字段,可以使用下面的方式:

    Db::table('think_user')
        ->where('id', 1)
        ->update([
            'login_time'  => ['exp','now()'],
            'login_times' => ['exp','login_times+1'],
        ]);
    
    

    更新某个字段的值:

    Db::table('think_user')
        ->where('id',1)
        ->setField('name', 'thinkphp');
    
    

    setField 方法返回影响数据的条数,没修改任何数据字段返回 0

    自增或自减一个字段的值

    setInc/setDec 如不加第二个参数,默认值为1

    // score 字段加 1
    Db::table('think_user')
        ->where('id', 1)
        ->setInc('score');
    // score 字段加 5
    Db::table('think_user')
        ->where('id', 1)
        ->setInc('score', 5);
    // score 字段减 1
    Db::table('think_user')
        ->where('id', 1)
        ->setDec('score');
    // score 字段减 5
    Db::table('think_user')
        ->where('id', 1)
        ->setDec('score', 5);
    
    

    延迟更新

    setInc/setDec支持延时更新,如果需要延时更新则传入第三个参数
    下例中延时10秒,给score字段增加1

    Db::table('think_user')->where('id', 1)->setInc('score', 1, 10);
    
    

    setInc/setDec 方法返回影响数据的条数

    助手函数

    // 更新数据表中的数据
    db('user')->where('id',1)->update(['name' => 'thinkphp']);
    // 更新某个字段的值
    db('user')->where('id',1)->setField('name','thinkphp');
    // 自增 score 字段
    db('user')->where('id', 1)->setInc('score');
    // 自减 score 字段
    db('user')->where('id', 1)->setDec('score');
    

    删除数据表中的数据

    // 根据主键删除
    Db::table('think_user')->delete(1);
    Db::table('think_user')->delete([1,2,3]);
    
    // 条件删除    
    Db::table('think_user')->where('id',1)->delete();
    Db::table('think_user')->where('id','<',10)->delete();
    
    

    delete 方法返回影响数据的条数,没有删除返回 0

    助手函数

    // 根据主键删除
    db('user')->delete(1);
    // 条件删除    
    db('user')->where('id',1)->delete();
    

    错误提示。

    API接口数据处理。

    路由处理。

    缓存机制。

    模块架构与配置。

    类库导入。

    系统常量。

    配置获取,配置设置,动态配置。

    渲染输出。

    namespace appindexcontroller;
    
    class Index 
    {
        public function hello()
        {
            return 'hello,world!';
        }
        
        public function json()
        {
            return json_encode($data);
        }
        
        public function read()
        {
            return view();
        }
    
    }
    

    输出转换。

    namespace appindexcontroller;
    
    class Index 
    {
        public function hello()
        {
            return 'hello,world!';
        }
        
        public function data()
        {
            return ['name'=>'thinkphp','status'=>1];
        }
        
    }
    
    // 默认输出类型
    'default_return_type'   => 'json',
    

    控制器初始化。

    namespace appindexcontroller;
    
    use thinkController;
    
    class Index extends Controller
    {
    
        public function _initialize()
        {
            echo 'init<br/>';
        }
        
        public function hello()
        {
            return 'hello';
        }
        
        public function data()
        {
            return 'data';
        }
    }
    

    页面跳转。

    在应用开发中,经常会遇到一些带有提示信息的跳转页面,例如操作成功或者操作错误页面,并且自动跳转到另外一个目标页面。系统的 hinkController类内置了两个跳转方法successerror,用于页面跳转提示。

    使用方法很简单,举例如下:

    namespace appindexcontroller;
    
    use thinkController;
    use appindexmodelUser;
    
    class Index extends Controller
    {
        public function index()
        {
            $User = new User; //实例化User对象
            $result = $User->save($data); 
            if($result){
                //设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']
                $this->success('新增成功', 'User/list');
            } else {
                //错误页面的默认跳转页面是返回前一页,通常不需要设置
                $this->error('新增失败');
            }
        }
    }
    

    跳转地址是可选的,success方法的默认跳转地址是$_SERVER["HTTP_REFERER"],error方法的默认跳转地址是javascript:history.back(-1);

    默认的等待时间都是3秒

    successerror方法都可以对应的模板,默认的设置是两个方法对应的模板都是:

    THINK_PATH . 'tpl/dispatch_jump.tpl'
    

    我们可以改变默认的模板:

    //默认错误跳转对应的模板文件
    'dispatch_error_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
    //默认成功跳转对应的模板文件
    'dispatch_success_tmpl' => APP_PATH . 'tpl/dispatch_jump.tpl',
    

    重定向。

    空操作。

    空操作是指系统在找不到指定的操作方法的时候,会定位到空操作(_empty)方法来执行,利用这个机制,我们可以实现错误页面和一些URL的优化。
    例如,下面我们用空操作功能来实现一个城市切换的功能。

    我们只需要给City控制器类定义一个_empty (空操作)方法:

    <?php
    namespace appindexcontroller;
    
    class City 
    {
        public function _empty($name)
        {
            //把所有城市的操作解析到city方法
            return $this->showCity($name);
        }
        
        //注意 showCity方法 本身是 protected 方法
        protected function showCity($name)
        {
            //和$name这个城市相关的处理
             return '当前城市' . $name;
        }
    }
    

    接下来,我们就可以在浏览器里面输入

    http://serverName/index/city/beijing/
    http://serverName/index/city/shanghai/
    http://serverName/index/city/shenzhen/
    

    由于City并没有定义beijing、shanghai或者shenzhen操作方法,因此系统会定位到空操作方法 _empty中去解析,_empty方法的参数就是当前URL里面的操作名,因此会看到依次输出的结果是:

    当前城市:beijing
    当前城市:shanghai
    当前城市:shenzhen
    

    空控制器

    空控制器的概念是指当系统找不到指定的控制器名称的时候,系统会尝试定位空控制器(Error),利用这个机制我们可以用来定制错误页面和进行URL的优化。
    现在我们把前面的需求进一步,把URL由原来的

    http://serverName/index/city/shanghai/
    
    

    变成

    http://serverName/index/shanghai/
    
    

    这样更加简单的方式,如果按照传统的模式,我们必须给每个城市定义一个控制器类,然后在每个控制器类的index方法里面进行处理。 可是如果使用空控制器功能,这个问题就可以迎刃而解了。

    我们可以给项目定义一个Error控制器类

    <?php
    namespace appindexcontroller;
    
    use thinkRequest;
    
    class Error 
    {
        public function index(Request $request)
        {
            //根据当前控制器名来判断要执行那个城市的操作
            $cityName = $request->controller();
            return $this->city($cityName);
        }
        
        //注意 city方法 本身是 protected 方法
        protected function city($name)
        {
            //和$name这个城市相关的处理
             return '当前城市' . $name;
        }
    }
    
    

    接下来,我们就可以在浏览器里面输入

    http://serverName/index/beijing/
    http://serverName/index/shanghai/
    http://serverName/index/shenzhen/
    
    

    由于系统并不存在beijing、shanghai或者shenzhen控制器,因此会定位到空控制器(Error)去执行,会看到依次输出的结果是:

    当前城市:beijing
    当前城市:shanghai
    当前城市:shenzhen
    
    

    空控制器和空操作还可以同时使用,用以完成更加复杂的操作。

    空控制器Error是可以定义的

    // 更改默认的空控制器名
    'empty_controller'      => 'MyError',
    
    

    当找不到控制器的时候,就会定位到MyError控制器类进行操作。

    数据请求。

    设置/获取 模块/控制器/操作名称

    $request = Request::instance();
    echo "当前模块名称是" . $request->module();
    echo "当前控制器名称是" . $request->controller();
    echo "当前操作名称是" . $request->action();
    

    获取请求参数

    $request = Request::instance();
    echo '请求方法:' . $request->method() . '<br/>';
    echo '资源类型:' . $request->type() . '<br/>';
    echo '访问ip地址:' . $request->ip() . '<br/>';
    echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>';
    echo '请求参数:';
    dump($request->param());
    echo '请求参数:仅包含name';
    dump($request->only(['name']));
    echo '请求参数:排除name';
    dump($request->except(['name']));
    

    获取路由和调度信息

    $request = Request::instance();
    echo '路由信息:';
    dump($request->route());
    echo '调度信息:';
    dump($request->dispatch());
    

    变量处理。

    可以通过Request对象完成全局输入变量的检测、获取和安全过滤,支持包括$_GET$_POST$_REQUEST$_SERVER$_SESSION$_COOKIE$_ENV等系统变量,以及文件上传信息。

    检测变量是否设置

    可以使用has方法来检测一个变量参数是否设置,如下:

    Request::instance()->has('id','get');
    Request::instance()->has('name','post');
    
    

    或者使用助手函数

    input('?get.id');
    input('?post.name');
    
    

    变量检测可以支持所有支持的系统变量。

    获取GET变量

    Request::instance()->get('id'); // 获取某个get变量
    Request::instance()->get('name'); // 获取get变量
    Request::instance()->get(); // 获取所有的get变量(经过过滤的数组)
    Request::instance()->get(false); // 获取所有的get变量(原始数组)
    
    

    或者使用内置的助手函数input方法实现相同的功能:

    input('get.id');
    input('get.name');
    input('get.');
    

    获取请求类型

    在很多情况下面,我们需要判断当前操作的请求类型是GETPOSTPUTDELETE或者HEAD,一方面可以针对请求类型作出不同的逻辑处理,另外一方面有些情况下面需要验证安全性,过滤不安全的请求。

    ThinkPHP5.0 取消了用于判断请求类型的系统常量(如IS_GET,IS_POST等),统一采用 thinkRequest类 处理请求类型。

    用法如下

    // 是否为 GET 请求
    if (Request::instance()->isGet()) echo "当前为 GET 请求";
    // 是否为 POST 请求
    if (Request::instance()->isPost()) echo "当前为 POST 请求";
    // 是否为 PUT 请求
    if (Request::instance()->isPut()) echo "当前为 PUT 请求";
    // 是否为 DELETE 请求
    if (Request::instance()->isDelete()) echo "当前为 DELETE 请求";
    // 是否为 Ajax 请求
    if (Request::instance()->isAjax()) echo "当前为 Ajax 请求";
    // 是否为 Pjax 请求
    if (Request::instance()->isPjax()) echo "当前为 Pjax 请求";
    // 是否为手机访问
    if (Request::instance()->isMobile()) echo "当前为手机访问";
    // 是否为 HEAD 请求
    if (Request::instance()->isHead()) echo "当前为 HEAD 请求";
    // 是否为 Patch 请求
    if (Request::instance()->isPatch()) echo "当前为 PATCH 请求";
    // 是否为 OPTIONS 请求
    if (Request::instance()->isOptions()) echo "当前为 OPTIONS 请求";
    // 是否为 cli
    if (Request::instance()->isCli()) echo "当前为 cli";
    // 是否为 cgi
    if (Request::instance()->isCgi()) echo "当前为 cgi";
    
    

    助手函数

    // 是否为 GET 请求
    if (request()->isGet()) echo "当前为 GET 请求";
    

    分页处理。

    模板文件定义

    每个模块的模板文件是独立的,为了对模板文件更加有效的管理,ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:

    视图目录/控制器名(小写)/操作名(小写)+模板后缀

    默认的视图目录是模块的view目录,框架的默认视图文件后缀是.html

    模板渲染规则

    模板渲染使用 hinkView类的fetch方法,渲染规则为:

    模块@控制器/操作

    模板文件目录默认位于模块的view目录下面,视图类的fetch方法中的模板文件的定位规则如下:

    如果调用没有任何参数的fetch方法:

    return $view->fetch();
    
    

    则按照系统的默认规则定位模板文件到:

    [模板文件目录]/当前控制器名(小写+下划线)/当前操作名(小写).html

    如果(指定操作)调用:

    return $view->fetch('add');
    
    

    则定位模板文件为:

    [模板文件目录]/当前控制器名(小写+下划线)/add.html

    如果调用控制器的某个模板文件使用:

    return $view->fetch('user/add');
    
    

    则定位模板文件为:

    [模板文件目录]/user/add.html

    跨模块调用模板

    return $view->fetch('admin@user/add');
    
    

    全路径模板调用:

    return $view->fetch(APP_PATH.request()->module().'/view/public/header.html');
    

    模板使用函数。

    模板使用默认值。

    模板使用运算符。

    模板内置标签,循环/比较/条件判断/嵌套/原生PHP。

    表单验证。

  • 相关阅读:
    解决 idea 项目中Error:java: 无效的标记: XX:MaxPermSize=512M
    vant预览图片
    react路由
    computed和watch
    仓库系统面单常用的打印插件
    04.简单了解一下Redis企业级数据备份方案
    CRMEB 源码 login页 获取信息 缓存修改
    frp 搭建远程桌面
    ABP asp.net core 项目发布 IIS部署
    MYSQL 监控数据库SQL语句 查看数据库执行语句
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/7479880.html
Copyright © 2020-2023  润新知