项目包含的关键点,后台,前台。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方法的同样的效果。
在find
和select
方法以前可使用全部的链式操做方法。
默认状况下,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
类内置了两个跳转方法success
和error
,用于页面跳转提示。
使用方法很简单,举例以下:
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秒
success
和error
方法均可以对应的模板,默认的设置是两个方法对应的模板都是:
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.');
在不少状况下面,咱们须要判断当前操做的请求类型是GET
、POST
、PUT
、DELETE
或者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。
表单验证。