tp5框架知识点

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

入口文件。php

通用配置文件。css

数据库配置文件。html

共有文件,css,images,js。java

控制器,模型,视图。thinkphp

共有类。数据库

共有函数。json

属性,方法。数组

命名规范。浏览器

命名空间。

自动加载。

数据库操做。

基本查询

查询一个数据使用:

// 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 app\index\controller;

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

}

输出转换。

namespace app\index\controller;

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

控制器初始化。

namespace app\index\controller;

use think\Controller;

class Index extends Controller
{

    public function _initialize()
    {
        echo 'init<br/>';
    }
    
    public function hello()
    {
        return 'hello';
    }
    
    public function data()
    {
        return 'data';
    }
}

页面跳转。

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

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

namespace app\index\controller;

use think\Controller;
use app\index\model\User;

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 app\index\controller;

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 app\index\controller;

use think\Request;

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等),统一采用 think\Request类 处理请求类型。

用法以下

// 是否为 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

模板渲染规则

模板渲染使用\think\View类的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。

表单验证。

相关文章
相关标签/搜索