获取请求参数
门面方式获取请求参数
- 在route/route.php中定义不同请求方式的控制器路由
<?php
use think\facade\Route;
Route::get('req','@index/Index/req');
Route::post('req','@index/Index/req');
Route::put('req','@index/Index/req');
Route::delete('req','@index/Index/req');
- 在Index控制器类中定义req方法获取参数
<?php
namespace app\index\controller;
use think\facade\Request;
class Index
{
public function index()
{
return 'php是世界上最好的语言';
}
public function req(){
// GET的获取
#echo Request::get('id');
// 如果没有则使用默认值
#echo Request::get('age',20);
#echo Request::get('age',20,'intval');
// 获取get全部数据
#dump(Request::get());
// 判断一个key是否存在
#dump(Request::has('sex'));
// 获取指定的数据 白名单
#dump(Request::only(['id','age']));
// 排除不要的数据 黑名单
#dump(Request::except(['id']));
// POST获取
#dump(Request::post('name'));
// PUT获取
#dump(Request::put('name'));
// DELETE获取
#dump(Request::delete('name'));
// 获取任意类型
#dump(Request::param('name'));
// 判断请求的类型
dump(Request::isGet());
dump(Request::isPost());
dump(Request::isPut());
dump(Request::isDelete());
}
}
- postman模拟ajax请求
- 提交模式:POST
- Headers增加参数:
Content-Type为:application/x-www-form-urlencoded X-Requested-With 为:xmlhttprequest - Body选择为:x-www-form-urlencoded,参数为模拟AJAX提交的内容
<?php
namespace app\index\controller;
use think\facade\Request;
class Index
{
public function req(){
// 是否是ajax请求
dump(Request::isAjax());
}
}
依赖注入方式获取变量
<?php
namespace app\index\controller;
use think\Request;
class Index
{
public function index()
{
return 'php是世界上最好的语言';
}
public function req(Request $request){
// 依赖注入方式 [推荐]
#$request = Req::instance(); # tp5.0有人这样来申明,但是我们推荐依赖注入
dump($request->get('name'));
dump($request->has('sex'));
dump($request->only(['id']));
dump($request->except(['id']));
}
}
辅助函数获取请求参数()
- 推荐使用辅助函数
- 优点:框架做了参数的安全处理 ,写起来更加方便,(一般框架提供了的就使用框架的,原生的没有做任何处理)
- 缺点:没有黑名单和白名单
public function req(Request $request){
// 辅助函数 [推荐]
// 获取GET的全部参数
//dump(input('get.'));
// 获取指定的数据
//dump(input('get.id'));
#dump(input('get.sex','女士'));
// post数据
//dump(input('post.'));
// 获取任意类型的请求,推荐这种写法,简单方便
//dump(input('param.'));
//dump(input(''));
// 获取任意类型的 key 为name值 如果get和post优先post
//dump(input('name'));
// 判断一个key是否存在
#dump(input('?name'));
// 使用变量修饰符 a 数组 s 字符串 d 数字(相当于类型强转)
#dump(input('id/d'));
}
参数绑定
响应
json数据返回
由于默认是输出Html输出,所以直接以html页面方式输出响应内容,但也可以设置默认输出为json格式 config/app.php
‘default_return_type’ => ‘json’,
- 返回json数据
return json($data,http状态码);
return json($data)->code(201)->header(['Content-Type' => 'application/json']);
代码示例
public function req(int $id = 0) {
#return '我是一个HTML';
#$data = ['status' => 1000, 'msg' => '添加成功'];
#return json($data,201,['username'=>'admin','password'=>'admin888']);
}
重定向
- 可以使用redirect助手函数进行重定向
redirect(url('地址或方法名',数组参数));
<?php
namespace app\index\controller;
use think\facade\Route;
use think\Env;
class Index
{
public function req(int $id){
//echo url('index/Index/req2',['id'=>2]);
//跳转到index/Index/req2方法
return redirect(url('index/Index/req2',['id'=>2]));
}
public function req2(){
echo "我是req2";
}
}
=如果自定义了路由的话使用url函数参数写pathinfo地址是可以自动转换成自定义路由地址,示例如下=
视图
模板的定义
- ThinkPHP对模板文件进行目录划分,默认的模板文件定义规则是:=视图目录(view)/控制器名(小写)/方法名(小写)+ 模板后缀(框架的默认视图文件后缀是.html)=
模板渲染
- 渲染模板最常用的是控制器类在继承系统控制器基类(\think\Controller)后调用fetch方法,调用格式:
fetch(’[模板文件]’,[‘模板变量(数组)’])
<?php
use think\facade\Route;
Route::get('test','@index/index/test')->name('index/index/test');
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function test()
{
//pathinfo路由写法
//return $this->fetch();
//pathinfo 自定义路由写法都可以
return $this->fetch('index@index/test');
}
}
- 助手函数view渲染模板文件
无论你是否继承think\Controller类,助手函数都可以使用,也是最方便的一种
<?php
namespace app\index\controller;
class Index
{
public function test()
{
return view('index@index/test');
}
}
模板赋值
- 方法一 $this->assign(‘自定义变量名’,定义的变量名);这个方法在其他框架中很少,所以尽量不要养成这种写法
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function test()
{
$name='thinkphp';
$this->assign('val1',$name);
return view('index@index/test');
}
}
view/index/test.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php</title>
</head>
<body>
<h1>变量值:{$val1}</h1>
</body>
</html>
- 方法二 以关联数组的方式在渲染模板方法view第二个参数填写
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function test()
{
$val='thinkphp';
$arr=['id'=>1,'name'=>'jack'];
return view('index@index/test',['name'=>$val,'arr'=>$arr]);
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php</title>
</head>
<body>
<h1>变量值:{$name}</h1>
<h1>id:{$arr['id']}</h1>
<h1>name:{$arr['name']}</h1>
</body>
</html>
- 方法三 compact()函数,推荐用法
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function test()
{
$val='thinkphp';
$arr=['id'=>1,'name'=>'jack'];
return view('index@index/test',\compact('val','arr'));
}
}
全局赋值
<?php
namespace app\index\controller;
use think\Controller;
use think\facade\View;
class Index extends Controller
{
public function test()
{
//全局赋值的变量
View::share('webname','网站的名称');
$val=1;
return view('index@index/test',\compact('val'));
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php</title>
</head>
<body>
<h1>全局赋值的变量直接全局使用:{$webname}</h1>
<h1>id:{$id}</h1>
</body>
</html>
模板的标签可以在配置文件中修改
模板使用函数
- 格式:{$code|md5}
当然也可以写成如下的写法,推荐{:md5($code)}
<?php
namespace app\index\controller;
use think\Controller;
use think\facade\View;
class Index extends Controller
{
public function test()
{
$code='112343';
return view('index@index/test',\compact('code'));
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php</title>
</head>
<body>
<h5>{$code|md5}</h5>
<h5>推荐写法:{:md5($code)}</h5>
</body>
</html>
=注:不但用php系统提供函数,还可以用tp提供的函数,还可以用户在tp规定的文件中定义的写的函数=
- 在application/common自定义公共函数
调用自定义函数
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php</title>
</head>
<body>
<h5>{$code|md5}</h5>
<h5>推荐写法:{:mymd5($code)}</h5>
</body>
</html>
模板原样输出
{literal}
Hello,{$name}!
{/literal}
上面的{$name}标签被literal标签包含,因此并不会被模板引擎解析,而是保持原样输出
模板中循环标签{foreach}{/foreach}
<?php
namespace app\index\controller;
use think\Controller;
use think\facade\View;
class Index extends Controller
{
public function test()
{
$data = [
['id' => 1, 'name' => '张三'],
['id' => 2, 'name' => '李四'],
['id' => 3, 'name' => '王五'],
['id' => 4, 'name' => '赵六'],
];
return view('index@index/test',compact('data'));
}
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php</title>
</head>
<body>
<ul>
{volist name="data" id="vo"}
<li>{$vo.id} --- {$vo.name}</li>
{/volist}
{foreach $data as $val}
<li>{$val.id} --- {$val.name}</li>
{/foreach}
</ul>
</body>
</html>
模板中条件判断{if}{/if}
public function test()
{
$age = 10;
return view('index@index/test',compact('age'));
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php</title>
</head>
<body>
<div>
{if $age < 10}
儿童
{elseif $age<30/}
青年
{else/}
老年
{/if}
</div>
</body>
</html>
模板继承
模板继承的优势其实是用{block} {/block}标签设计好基础模板然后使用{block} {/block}标签在子模板中替换这些区块
定义一个基类模板base.html
子模块继承 然后用{block} {/block}标签替换这些块
数据库操作
原生的sql
- 连接数据库
在应用配置目录或者模块配置目录下面的config/database.php中配置下面的数据库参数
Db类支持原生SQL查询操作
# 查询
Db::query("select * from admins where id=? AND status=?", [8, 1]);
# 添加、更新与删除
Db::execute("update admins set name=:name where status=:status", ['name' => 'thinkphp', 'status' => 1]);
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Index extends Controller
{
public function test()
{
// $sql = "select * from admins where id=?";
// $ret = Db::query($sql,[1]);
// dump($ret);
# 如果一定要写原生sql,推荐写此关联数组占位
// $sql = "select * from admins where id=:id";
// $ret = Db::query($sql, ['id' => 1]);
// dump($ret);
// 添加
// $sql = "insert into admins (username,password,truename,gid,status,add_time) values (:username,:password,:truename,:gid,:status,:add_time)";
// $ret = Db::execute($sql, ['username' => '1', 'password' => '1','truename'=>'1','gid'=>1,'status'=>1,'add_time'=>123435]);
// dump($ret);
// 修改
/*$sql = "update admins set username=:username where id=:id";
$ret = Db::execute($sql,['username'=>'新名字','id'=>1]);
dump($ret);*/
// 删除
$sql = "delete from admins where id=:id";
$ret = WuDb::execute($sql, ['id' => 1]);
dump($ret);
}
}
tp框架提供的多种方式执行sql
-tp增删改代码示例
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
class Index extends Controller
{
public function testsql()
{
#添加一条数据
//$data = ['username' => '1', 'password' => '1','truename'=>'1','gid'=>1,'status'=>1,'add_time'=>123435];
// 返回影响的行数
// table写全表名称
//$ret = Db::table('admins')->insert($data);
// name可以不写表前缀
//$ret = Db::name('admins')->insert($data);
// 推荐写方法 不需要表前缀,这个也不需要包含use think\Db 类
//$ret = db('admins')->insert($data);
//dump($ret);
// 返回插入成功后的主键ID
//$ret = db('admins')->insertGetId($data);
//dump($ret);
#添加多条数据
// $data = [
// ['username' => '1', 'password' => '1','truename'=>'1','gid'=>1,'status'=>1,'add_time'=>123435],
// ['username' => '2', 'password' => '1','truename'=>'1','gid'=>1,'status'=>1,'add_time'=>123435],
// ];
// // 返回受影响的行数
// $ret = db('admins')->insertAll($data);
// dump($ret);
#修改数据,where条件中等于号可以不写,其他的必须xie
#$data = ['username' => '新名字', 'password' => '22', 'truename' => 'bbbb'];
#$ret = db('admins')->where('id',211)->update($data);
//$ret = db('admins')->where('id','=',985)->update($data);
//没有where的是从data中找主键筛选条件
#$data = [‘id'=>1 'username' => '新名字', 'password' => '22', 'truename' => 'bbbb'];
#$ret = db('admins')->update($data);
#dump($ret);
// 5.1.7之后还支持了Db::raw写法,字段click执行一次数量+1,可以统计访问量
// $ret = db('admins')->where('id',1)->update([
// 'click' => Db::raw('click+1')
// ]);
// dump($ret);
# 删除数据
//根据主键删除
#$ret = db('admins')->delete(1);
#$ret = db('admins')->delete([1,2]);
//根据条件删除 ,where没有写默认是id=100
#$ret = db('admins')->where('id',100)->delete();
//软删除数据 使用delete_time字段标记删除 逻辑删除
//软删除,必须要表中要delete_time字段
$ret = db('admins')->where('id',3)->useSoftDelete('delete_time',time())->delete();
dump($ret);
}
}
-tp查询代码示例
<?php
namespace app\index\controller;
use think\Controller;
use think\Db;
use think\db\Query;
use think\db\Where;
class Index extends Controller
{
public function testSelect()
{
# 查询一条数据
//$ret = db('admins')->find(1);
//$ret = db('admins')->where('id',209)->find();
# 查询多条记录
//id大于100 click大于100
#$ret = db('admins')->where('id','>',100)->where('click','>',100)->select();
//如果希望在没有找到数据后抛出异常可以使用 ,此用法一般用于 接口
//$ret = db('admins')->where('id',985)->findOrFail();
//$ret = db('admins')->where('id','>',500)->selectOrFail();
// 没有查询分组,这种sql语句select * from 表名 where id>10 and name like 'a%'
// $where = [
// ['id', '>', 100],
// ['click', '>', 100]
// ];
// $ret = db('admins')->where($where)->select();
// $where = [
// 'id' => ['>', 100],
// 'click' => ['>', 100]
// ];
// $obj = new Where($where);
// $ret = db('admins')->where($obj)->select();
// 有查询分组,这种sql语句select * from 表名 where (id>10 and name like 'a%') or (level>100 and age>20)
// $ret = db('admins')->where(function (Query $query){
// $query->where('id','>',100)->where('click','>',100);
// })->select();
// $ret = db('admins')->where(function (Query $query){
// $query->where('id','>',100)->where('click','>',100);
// })->whereOr(function (Query $query){
// $query->where('title','like','a%');
// })->select();
// 排序和分页
//$ret = db('admins')->order('id','desc')->limit(0,2)->select();
// 获取指定的字段的值
//$ret = db('admins')->where('id',1)->value('username');
// 获取指定的列,第二个个参数如果写的话则这个列的值为数组的key
//$ret = db('admins')->column('username');
//$ret = db('admins')->column('id','username');
//获取器可以获取到值后进行重新编辑,withAttr() 对获取的数据2次处理,然后return再输出。
// 获取器 当前值 数据源
$ret = db('admins')->withAttr('username',function ($value,$data){
return 'php--'.$value;
})->where('id','<',3)->select();
dump($ret);
}
}
模型
模型定义与模型设置
-
使用命令创建模型
- php think make:model 模块名/模型名(首字母大写)
=写了模块名表示此模型只能在此模块中使用,没有写模块名则会在common公共模块中,这个模型类是所有模块都能使用的=
模型会自动对应数据表,模型类的命名规则是除去表前缀的数据表名称,采用驼峰法命名,并且首字母大写
- php think make:model 模块名/模型名(首字母大写)
-
模型类设置
- 模型类名如果和数据表名不一致要设置对应的完整数据表名称如果你的规则和上面的系统约定不符合,那么需要设置Model类的数据表名称属性,以确保能够找到对应的数据表
<?php
namespace app\common\model;
use think\Model;
class admins extends Model
{
//模型类名如果和数据表名不一致要设置对应的完整数据表名称
protected $table = 'admins'; #设置当前模型对应的完整数据表名称
}
- 模型主键设置
- 默认主键为id,如果你没有使用id作为主键名,需要在模型中设置属性
<?php
namespace app\common\model;
use think\Model;
class Admins extends Model
{
protected $pk = 'uid'; # 设置主键名称
}
模型增删改操作
- 实例化模型的两种方式
$model = new Articles();
$model = model(‘articles’);//框架提供的方法实例 - 软删除
- 在实际项目中,对数据频繁使用删除操作会导致性能问题,软删除的作用就是把数据加上删除标记,而不是真正的删除,同时也便于需要的时候进行数据的恢复。
- 要使用软删除功能,需要引入SoftDelete,数据表中要有字段delete_time,例如Admins模型按照下面的定义就可以使用软删除功能
<?php
namespace app\common\model;
use think\Model;
use think\model\concern\SoftDelete;
class Admins extends Model
{
// 引入软删除的操作方法
use SoftDelete;
// 删除的字段名
protected $deleteTime = 'delete_time';
}
- 增删改代码示例
<?php
namespace app\index\controller;
use think\Controller;
use app\common\model\Admins;
class Index extends Controller
{
//增加
public function testModelAdd(){
$data = ['username' => 'aaa', 'password' => 'aaa','truename'=>'aaa','gid'=>1,'status'=>1,'add_time'=>123435];
// 添加方法1
//$admins = model('Admins');
//$admins = new Admins();
//$ret = $admins->save($data);
//过滤post数组中的非数据表字段数据,指定要插入的字段数据
//$ret = $admins->allowField(true)->save($data);
//$ret = $admins->allowField([要插入的字段,要插入的字段])->save($data);
// 添加方法2 推荐使用静态方法添加数据,添加成功后返回的是数据集
$ret = Admins::create($data);
dump($ret);
}
//修改
public function testModelUpdata(){
$data = ['username'=>'newName'];
$ret = Admins::where('id',7)->update($data);
dump($ret);
}
//删除
public function testModelDel(){
# 删除模型数据,可以在查询后调用delete方法
//$model = Admins::find(7);
//$model = Admins::get(8);
//$ret = $model->delete();
// 根据主键删除,当destroy方法传入空值(包括空字符串和空数组)的时候不会做任何的数据删除操作,但传入0则是有效的
//$ret = Admins::destroy(1);//删除单个
//$ret = Admins::destroy([2,3]);//删除多个
//条件删除
// $ret = Admins::destroy(function($query){
// $query->where('id','>',9);
// });
$ret = Admins::where('id','=',6)->delete();
dump($ret);
}
//软删除
public function testModelSoftDel(){
//$ret = Admins::destroy(4);//删除单个
//$ret = Admins::destroy(5);//删除单个
//软删除的不会查询出来
$ret = Admins::select();
//将软删除的全部查询出来
#$ret = Admins::withTrashed()->select();
//只查询软删除的
//$ret = Admins::onlyTrashed()->select();//查询所有软删除的数据
$ret = Admins::onlyTrashed()->find(5);//查询软删除中指定的单条数据
// 第二个参数为true时表示强制删除数据
//$ret = Admins::destroy(5,true);//删除单个
dump($ret);
}
}
//查询
public function testModelSelect(){
#查询单条
//模型的查询 get直接查询,不可以带where条件,find两者都可以 ,推荐find
#$ret = Admins::get(1);
#$ret = Admins::find(2);
#$ret = Admins::where('id',3)->find();
// 条件分组 where () or ()
//$ret = Admins::where(function (Query $query){
// #print_r(func_get_args());
// $query->where('id','>',200);
// })->whereOr(function (Query $query){
// $query->where('gid','>=',101);
// })->select();
#查询多条 select
#$ret = Admins::where('username','我是张三')->select();
// 动态查询 getBy固定 字段名,首字母大写,遇到下划线,下划线的后的首字母大写
// 例: add_time getByAddTime(12343)
$ret = Admins::getByUsername('admin');
\dump($ret);
}
- 模型获取器
<?php
namespace app\common\model;
use think\Model;
class Admins extends Model
{
// 获取器 get字段名Attr 如果有下划线,下划线的后首字母大写
public function getAddTimeAttr($value){
return date('Y年m月d日 H时i分s秒',$value);
}
}
<?php
namespace app\index\controller;
use think\Controller;
use app\common\model\Admins;
use think\db\Query;
class Index extends Controller
{
public function testModelSelect(){
$ret = Admins::select();
\dump($ret);
}
}
- 模型数据分页
ThinkPHP5.1内置了分页实现,要给数据添加分页输出功能变得非常简单,可以直接在Db类查询的时候调用paginate方法- 代码示例
<?php
namespace app\index\controller;
use think\Controller;
use app\common\model\Admins;
class Index extends Controller
{
public function testModelSelect(){
// 参数一1:每页的数量 参数2:是否是简洁方式,true则是只有上下页两个按钮,false则会统计所有页数按钮 参数3:相关配置
$data = Admins::paginate(1,false,['var_page'=>'p']);
// 查询对象中可用的方法
#dump(get_class_methods($data));
#echo $data->total();
return \view('index@index/test',\compact('data'));
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文章列表</title>
<link rel="stylesheet" href="/static/index/css/bootstrap.css" />
<link rel="stylesheet" href="/static/index/css/bootstrap-theme.css" />
<script src="/static/js/jquery.min.js"></script>
<script src="/static/index/js/bootstrap.js"></script>
</head>
<body>
<br>
<div class="container">
<table class="table table-hover">
<thead>
<tr>
<th>ID</th>
<th>名字</th>
</tr>
</thead>
<tbody>
{foreach $data as $item}
<tr>
<td>{$item.id}</td>
<td>{$item.username}</td>
<td>
<div class="btn-group">
<a href="button" class="btn btn-xs btn-primary">修改</a>
<a href="button" class="btn btn-xs btn-danger">删除</a>
</div>
</td>
</tr>
{/foreach}
</tbody>
</table>
<div>
<!--推荐写法-->
{$data|raw}
<!--不推荐-->
{/*:html_entity_decode ($data->render())*/}
</div>
</div>
</body>
</html>