【PHP】ThinkPHP6中间件介绍
一、什么是中间件?
当客户端发送请求至服务器时,HTTP请求会经过多个中间件,最后返回响应给客户端。中间件可以
-
在请求到达目标控制器或动作之前对请求进行操作
-
可以在响应离开目标控制器或动作之前对响应进行操作
二、中间件的作用
我们可以在不修改应用程序逻辑的情况下添加额外的功能,如
-
登录验证、
-
检查用户权限、权限控制
-
请求过滤
-
判断当前浏览器环境是在微信或支付宝
-
写系统日志
-
统计
三、中间件的类型
1、前置中间件
前置中间件的意思就是,在http请求完成之前,先执行中间件的代码。
一般用来检查用户权限
在app/middleware中新建中间件,每个中间件一个文件
<?php
namespace app\middleware;
// 前置行为的中间件
class AuthMiddleware
{
public function handle($request, \Closure $next)
{
// 添加中间件执行代码 start
echo ' </br>hello </br>';
// 添加中间件执行代码 end
return $next($request);
}
}
2、后置中间件
后置中间件的意思就是,在http请求完成之后,才开始执行中间件的代码。
一般用来写日志、统计
<?php
namespace app\middleware;
// 后置行为的中间件
class LogMiddleware
{
public function handle($request, \Closure $next)
{
$response = $next($request);
// 添加中间件执行代码 start
echo ' </br>good bye!</br>';
// 添加中间件执行代码 end
return $response;
}
}
中间件说明:
1、中间件的入口执行方法必须是handle
方法,而且第一个参数是Request
对象,第二个参数是一个闭包;
2、中间件handle
方法的返回值必须是一个Response
对象;
3、中间件里可以直接使用Request对象,获取请求参数;
四、使用中间件
根据作用范围可以分为4种中间件
全局中间件->应用中间件->路由中间件->控制器中间件
-
全局中间件
全局中间件在app
目录下面middleware.php
文件中定义
2. 应用中间件
直接在应用目录下面增加middleware.php
文件,定义方式和全局中间件定义一样,只是只会在该应用下面生效。
<?php
return [
app\middleware\AuthMiddleware::class,
];
访问该应用下的任何一个函数,都会先执行了中间件
3. 路由中间件
访问了对应的路由,则会调用对应的中间件,可以调用多个
Route::rule('hello/:name','hello')
4. 控制器中间件
在控制器中定义middleware
属性,例如:
上述代码指定了该控制器下的所有函数被调用都会执行对应的控制器
可以通过“except"和‘only’字段为控制器中函数自定义调用的中间件
<?php
namespace app\addons\controller;
use think\Controller;
class Index extends Controller{
// auth中间件,使用了except,表示出了hello方法外,这个控制器其他的方法都会执行这个中间件
// check中间件,使用了only表示只有这个控制器的login方法执行这个中间件
// log中间件,没有使用任何限定参数,表示这个控制器里面所有的方法都会执行log这个中间件
protected $middleware = [
'auth' => ['except' => ['hello']],
'check' => ['only' => 'login'],
'log'
];
public function index(){
echo "this is a addons index controller index function";
}
public function login(){
echo "abcd";
}
public function hello(){
echo "abcd";
}
}
五、向中间件传参
可以使用第三个参数传入额外的参数。
<?php
namespace app\middleware;
class Check
{
public function handle($request, \Closure $next, $name)
{
if ($name == 'think') {
return redirect('index/think');
}
return $next($request);
}
}
下面是给auth中间件传入了一个参数的值'admin'
Route::rule('hello/:name','hello')
六、中间件向控制器传参
<?php
namespace app\middleware;
class Hello
{
public function handle($request, \Closure $next)
{
$request->hello = 'ThinkPHP';
return $next($request);
}
}
在控制器的方法里面可以直接使用
public function index(Request $request)
参考:
https://www.php.cn/faq/559015.html
https://www.php.cn/faq/591280.html
https://www.php.cn/faq/562939.html
https://www.kancloud.cn/manual/thinkphp6_0/1037493
https://www.gxlsystem.com/phpkuangjia-2336420.html
猜你喜欢
- 【PHP】tp使用lunar-php,获取节日节气
- lunar-php 是一个用于获取公历和农历(即阳历和阴历)信息的 PHP 库。要使用 lunar-php 获取节日和节气,你需要先安装这个库。 首先,通过 Composer 安装 lunar-php:composer require chenmingl/lunar-php获取阳历阴历节日及节气:require 'vendor/autoload.php'; use Lunar\Lunar; //&nbs
- 【PHP】ThinkPHP5.0 Restful API 开发
- 一、要学习什么是 RESTful API 首先我们得明白什么是REST?简单来说:REST是所有Web应用都应该遵守的架构设计指导原则。 英文全词Representational State Transfer,翻译是”表现层状态转化”。面向资源 是REST最明显的特征,对于同一个资源的一组不同的操作。资源是服务器上一个可命名的抽象概念,资源是以名词为核心来组织的,首先关注的是名词。REST要求,必须通过统一的接口来对资源执行各种操作。对于每个资源只能执行一组有限的操作。(7个HTTP方法:GET
- 【PHP】MongoDB介绍
- MongoDBA是一个开源的、面向文档的NoSQLA数据库,它提供了高性能、可扩展的数据存储解决方案。MongoDB支持动态查询、高可用性、自动分片等功能,使其成为处理大规模数据集的优选数据库。MongoDB的核心特性包括:面向集合存储:数据被分组存储在集合中,集合类似于RDBMS中的表,但提供了更高的灵活性和无模式存储。无模式结构:存储在集合中的数据是无模式的,即每个文档可以有不同的字段和值类型,这为用户提供了极大的灵活性。高性能:MongoDB利用内存中的数据缓存来提高性能,并支持数据的
- 【PHP】workerman-jsonRpc 与 thinkphp6结合 的方法
- 1.下载workerman-jsonRpc的包2.将包内 vendor / workerman 下的内容放进tp的vendor目录下并加载(我先用composer装了GatewayWorker,然后把文件覆盖进去了) 3.创建一个tp的命令行,并给这个命令行添加2个自定义参数 4.将workerman-jsonrpc根目录下的start.php内容复制到你创建的命令行类的执行方法里,并把引入vendor那行删掉 5.打开workerman扩展的目录,找到Worker.php类文件 找到其中的
- 【PHP】PHP8如何通过Sanitize Filters来增强应用程序的安全性
- PHP是一门广泛应用于Web开发的脚本语言,而安全性一直是Web应用程序开发者需要关注的重要问题。PHP8提供了一种称为Sanitize Filters的机制,通过对用户输入进行过滤和清理,可以增强应用程序的安全性。本文将详细介绍PHP8中Sanitize Filters的使用方法,并提供一些具体的代码示例,帮助开发者更好地了解如何应用这一特性。首先,让我们来了解一下Sanitize Filters是什么。Sanitize Filters是一组用于过滤和清理用户输入数据的PHP函数,可以帮助开发
- 【PHP】php判断字符串是否含有日文字符
- 可以使用PHP的正则表达式函数preg_match()来检测字符串上的日文字符。以下是一个例子:$str = "こんにちは、世界!"; if (preg_match('/\p{Hiragana}|\p{Katakana}|\p{Han}/u', $str)) { echo "字符串包含日文字符。"; } else&nbs
- 【PHP】php中?:与??运算符有什么不同?
- 在PHP 7中,有两个类似的语法结构:“??”和“?:”,它们都是用于处理条件判断和返回值的运算符。尽管它们看起来相似,但它们的作用和用法有一些区别。"?:"是三目运算符,语法格式为:$result = $test ? $test : ′ ′ ; 意思就是当test存在时(即empty($test)为false),则返回它本身,否则返回空(当然也可以返回其他,这里的空只是举个例子)。"??"是php7新引入的语法,它相当于是isset($result[‘k
- 【PHP】CI,ThinkPHP,YII,Laravel框架比较
- 用过其中的yii TP CI框架。大概整理了这些框架的优点和缺点,有些错误的地方还希望大家指正。各个框架各有所长,针对的应用场景不同。一、Ci框架推崇简单就是美这一原则,没有花哨的设计模式,没有华丽的对象结构,一切就是那么简单。优点:框架的入门槛很低,极易学,极易用,框架很小,静态化非常容易配置简单,全部的配置使用php脚本来配置,执行效率高缺点:架构略简单,只能满足小型应用,略微不太能够满足中型应用需要大型项目扩展能力差,有些功能需要自己写扩展数据库类的扩展 ci给用户提供了一个名为call_