请求
请求对象
1.当控制器继承了控制器基类时,会自动被注入 Request 请求对象的功能
2.不继承控制器基类
4.通过构造方法进行注入
5.使用facade方式应用于没有进行依赖注入时使用 Request 对象的场合
use think\facade\Request;
class Index extends Controller
{
public function facade()
{
return Request::param('name');
}
}
6.使用助手函数
请求信息
class Index extends Controller
{
public function index()
{
return Request::url().'</br>'.Request::url(true);
}
}
请求变量
1.Request 对象支持全局变量检测,获取和安全过滤,支持$_GET,$_POST
等
2.使用 has() 方法,可以检测全局变量是否已经设置
class Index extends Controller
{
public function index()
{
dump(Request::has('id','get'));
dump(Request::has('name','post'));
}
}
3.支持变量表
4.param() 变量方法时识别 GET,POST 等的当前请求,推荐使用
对于变量的过滤,在全局设置一个过滤函数,也可以单独对某个变量过滤
# config/app.php
// 默认全局过滤方法 用逗号分隔多个
'default_filter' => 'htmlspecialchars',
如果设置过滤方法,上传变量信息会获取不到
# 单个设置
dump(Request::param('name','','htmlspecialchars'));
# public/test/test.html
<div>
<form action="http://localhost:8000/index/index/index" method="post" enctype="multipart/form-data">
<input type="file" name="image">
<input type="submit" value="confirm">
</form>
<!-- <input type="submit" id="button" value="confirm">-->
</div>
5.使用依赖注入,可以将变量作为对象的属性进行调用
public function read(\think\Request $request)
{
return $request->name;
}
6.路由获取
class Index extends Controller
{
public function read($id)
{
dump(Request::get());
dump(Request::param());
dump(Request::route());
}
}
# route/route.php
\think\facade\Route::get('route/:id','index/Index/read');
param::get() 不支持路由变量
7.除了 ::server()、::env() 方法外,其他方法传递的变量名区分大小写
因为 ::server()、::env() 属于系统变量,会强制转换为大写后获取值
8.默认值
class Index extends Controller
{
public function index()
{
dump(Request::param('name', 'ocean'));
dump(Request::param());
dump(Request::param(false));
dump(Request::param(true));
}
}
9.only
public function only()
{
dump(Request::only(['id']));
}
except
public function except()
{
dump(Request::except(['id']));
}
10.使用变量修饰符,可以将参数强制转换为指定的类型
/s(字符串)
/d(整型)
/b(布尔)
/a(数组)
/f(浮点)
助手函数简化
public function func()
{
dump(input('?get.id'));
}
请求类型
可以使用 method() 方法来判断当前的请求类型
# public/test/test.html
<form action="http://localhost:8000/index/index/check" method="post" enctype="multipart/form-data">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="confirm">
</form>
# 设置隐藏字段 _method,可以在 app.php 文件中设置为其他关键字
# <input type="hidden" name="_method" value="PUT">
# index/Index.php/check
public function check()
{
return Request::method();
# return Request::method(true); true获取原始请求
}
Ajax/Pjax 伪装
使用 ?_ajax=1
和 ?_pjax=1
,并使用 isAjax() 和 isPjax()
用 method 无法判断
在 app.php 也可以更改 ajax 和 pjax 的名称
HTTP头信息
使用 header() 方法输出 HTTP 头信息,返回数组类型,也可以单信息获取
public function check()
{
dump(Request::header());
dump(Request::header('host'));
}
伪静态
路由变量最后有 .html 作为伪静态
1.Url 伪静态后缀可以在 app.php 中设置
// URL伪静态后缀
'url_html_suffix' => 'html',
2.使用 url::build() 获取当前完整 url,得到默认后缀为 .html
public function check()
{
return \think\facade\Url::build();
}
3.如果地址栏用后缀访问成功后,可以使用 Request::ext() 方法得到当前伪静态
public function check()
{
return \think\facade\Url::build().', '.Request::ext();
}
参数绑定
1.默认参数
public function check($id=33,$uid=22)
{
return 'id:'.$id.','.'uid:'.$uid;
}
2.成对解析,可以换顺序
// URL参数方式 0 按名称成对解析 1 按顺序解析
'url_param_type' => 0,
请求缓存
部分功能 tp6 取消
全局缓存
// 是否开启请求缓存 true自动缓存 支持设置请求缓存规则
'request_cache' => false,
// 请求缓存有效期,建议3600,时间太短没有意义
'request_cache_expire' => null,
// 全局请求缓存排除规则
'request_cache_except' => [],
开启缓存后,第二次访问时,会自动获取请求缓存的数据响应输出,并发送304状态码
单独缓存
\think\facade\Route::get('route/:id','index/Index/read')->cache(3600);
响应
响应输出,包括 return(),json(),view()
public function response()
{
return response('index','201');
# return response('index')->code('201');
}
respond() 方法,可以设置第二参数,状态码,或调用 code() 方法
重定向
1.使用 redirect() 方法可以实现页面重定向
public function response()
{
return redirect('http://www.ocean888.cn');
# 注意一定有 http://
}
2.站内重定向,直接输入路由地址或相对地址即可,需要用顶级域名,二级会错误
return ('index');
3.通过 params() 方法传递数组参数键值对的方式,进行跳转
return redirect('check')->params(['id'=>'222']);
文件下载
文本文件和图片文件都可以使用 download() 方法下载
容器
依赖注入
手册说明
依赖注入其实本质上是指对类的依赖通过构造器完成自动注入,例如在控制器架构方法和操作方法中一旦对参数进行对象类型约束则会自动触发依赖注入,由于访问控制器的参数都来自于 URL 请求,普通变量就是通过参数绑定自动获取,对象变量则是通过依赖注入生成
# test/model/One.php
<?php
namespace app\test\model;
class One
{
protected $name='lisi';
public $sex='male';
}
# test/controller/Inject.php
<?php
namespace app\test\controller;
use app\test\model\One;
class Inject
{
protected $name;
public function __construct(One $one)
{
$this->one=$one;
}
public function index()
{
return $this->one->sex;
}
}
依赖注入:即允许通过类的方法传递对象的能力,并且限制了对象的类型(约束),传递的对象背后的哪个类被自动绑定并且实例化了
容器
依赖注入的类统一由容器管理,大多数情况下是自动绑定和自动实例化
如果想手动来完成绑定和实例化,可以使用 bind() 和 app() 助手函数来实现
public function index()
{
bind('one','app\test\model\One');
// 绑定 app\model\One 下的 one 对象
return app('one')->sex;
}
bind(‘one’,’…’) 绑定类库标识,这个标识具有唯一性,以便快速调用
app(‘one’) 快速调用,并自动实例化对象,表示严格保持一致包括大小写
自动实例化对象的方式,是采用单例模式实现,如果想重新实例化一个对象,则每次调用总会重新实例化
使用 bind([]) 可以实现批量绑定,只不过系统有专门提供批量绑定的文件
bind([
'one'=>'app\model\One',
'user'=>'app\model\User'
]);
return app('one')->name;
bind([
'one'=>\app\model\One::class,
'user'=>\app\model\User::class
]);
return app('one')->name;
# ::class 模式,不需要单引号,而且需要在最前面加上\
系统提供了 view/provider.php 文件,用于批量绑定类到容器中
return app('request')->param('name');
Facade
1.创建静态调用
Facade,即门面设计模式,为容器的类提供了一种静态的调用方式
之前使用的 请求 Request::,路由 Route::,数据库 Db::,都是静态调用
钩子
概念
1.钩子和行为在 tp6.0 的版本被废弃,用时间来取代,但意思相同
2.行为就是在系统执行的流程中执行的一个动作,如:当执行到路由时,对路由设置一些列的检测,即为行为
系统自带钩子
# app/tags.php
return [
// 应用初始化
'app_init' => ['app\test\behavior\Test',],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [],
];
# app/test/behavior/Test.php
<?php
namespace app\test\behavior;
class Test
{
public function run($params)
{
echo $params.'只要触发,就执行';
}
}
自定义钩子
Hook::listen(‘绑定钩子’,‘参数’)
# app/controller/inject.php
public function bhv()
{
\think\facade\Hook::listen('eat','干饭');
}
# app/tags.php
return [
'eat' => ['app\test\behavior\Test'],
];
初始化
# app/tags.php
return [
// 应用初始化
'app_init' => ['app\test\behavior\Test',],
];
# app/test/behavior/Test.php
<?php
namespace app\test\behavior;
class Test
{
public function run($params)
{
echo $params.'只要触发,就执行';
}
public function appInit()
{
echo '应用初始化';
}
}
app_init 对应的方法是 appInit(有下划线的大写)
中间件
类似于钩子,主要用于拦截和过滤 HTTP 请求,并进行相应处理
可以通过命令行模式,在应用目录下生成一个中间件文件和文件夹
php think make:middleware Check
<?php
namespace app\http\middleware;
class Check
{
public function handle($request, \Closure $next)
{
}
}
# handle 不能改
# Closure 匿 名函数
n($params)
{
echo $params.‘只要触发,就执行’;
}
public function appInit()
{
echo '应用初始化';
}
}
app_init 对应的方法是 appInit(有下划线的大写)
[外链图片转存中...(img-hyjgMvbo-1615809974519)]
[外链图片转存中...(img-qlQIWa9Z-1615809974520)]
### 中间件
类似于钩子,主要用于拦截和过滤 HTTP 请求,并进行相应处理
可以通过命令行模式,在应用目录下生成一个中间件文件和文件夹
```php
php think make:middleware Check
[外链图片转存中…(img-WL9QEkya-1615809974521)]
<?php
namespace app\http\middleware;
class Check
{
public function handle($request, \Closure $next)
{
}
}
# handle 不能改
# Closure 匿 名函数