中间件是什么?有什么作用?

中间件主要用于拦截或过滤应用的HTTP请求,并进行必要的业务处理。---tp5.1手册

也就是说,降低了系统的耦合;【在http请求阶段,执行中间件的入口执行方法(handle)--tp5.1】----减少了系统的一些if/else判断,因此降低了系统的耦合

中间件可以实现什么功能,例如权限验证,访问记录,重定向等等。-----这些业务的存在降低了耦合

Thinkphp中间件有什么用?

消息队列、远程方法调用RPC框架、ODBC、ORM持久化框架、缓存、资源定位、中间件定义的边界并不是很清晰,介于应用逻辑和操作系统(网络、存储系统)之间抽象层都可以算作中间件。

thinkphp5.1 中的中间件说明:
生成中间件:

php think make:middleware Check

这个指令会 application/http/middleware目录下面生成一个Check中间件

 <?php

 namespace app\http\middleware;

 class Check{
//第三个参数,可以通过路由赋值传递
public function handle($request, \Closure $next, $name)
{
//下面这一句是 给控制器 传值
$request->hello = 'ThinkPHP'; if ($name == 'think') {
return redirect('index/think');
} return $next($request);
} }

中间件的入口执行方法必须是handle方法,而且第一个参数是Request对象,第二个参数是一个闭包

前置中间件/后置中间件

前置中间件:在请求阶段实现,如:判断登录状态,访问权限等等

<?php

namespace app\http\middleware;
class auth{
public function handle($request, \Closure $next)
{
// 添加中间件执行代码 return $next($request);
}}

后置中间件:请求完成之后实现,如:写日志,请求分析等等

<?php

namespace app\http\middleware;
class Log{
public function handle($request, \Closure $next)
{
$response = $next($request); // 添加中间件执行代码 return $response;
}}

tp5.1中的配置文件:middleware.php【可以预先注册中间件,增加别名标识】,如果没有指定命名空间则默认使用app\http\middleware

return[

    'check' => app\http\middleware\Check:class,
'auth' => app\http\middleware\Auth:class,
'log' => app\http\middleware\Log:class ]

中间件的使用:【说明当一个方法里面有多个中间件【前置中间件】时,执行顺序按照 设置中间件使用的配置 的顺序执行,后置中间件的执行一定是在请求完成之后,才执行的,所以肯定是在最后才被执行】

一、在路由定义配置中设置,如:

return [

//下面路由注册的中间件,给中间件auth传递了"ahai",给中间件check传递了"token"参数,不写,则不传递参数
Route::rule('hello/:name','hello')->middleware(['auth:ahai','check:token','log']),
Route::rule('index/:name','think')->middleware('auth')
]

二、在控制器中设置,如:

 <?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller{ //这里配置了中间件,同时限制了中间件的生效操作,
//比如下面的auth中间件,使用了except,表示除了hello方法外,这个控制器的其他的方法都会执行中间件,
//check中间件,使用了only表示只有这个控制器的hello方法执行这个中间件
//log中间件,没有使用任何限定参数,表示这个控制器的所有方法都会执行log这个中间件
protected $middleware = [
'auth' => ['except' => ['hello'] ],
'check' => ['only' => ['hello'] ],
'log'
]; public function index()
{
echo request()->auth;
echo request()->check;
echo request()->log;
}
public function login()
{
echo request()->auth;
echo request()->check;
echo $this->request->log;
}
public function hello()
{
echo $this->request->log;
echo request()->auth;
echo request()->check;
} }
 <?php
namespace app\http\middleware;
class Auth
{
public function handle($request, \Closure $next)
{
$request->auth = 'auth';
return $next($request);
}
}
<?php
namespace app\http\middleware;
class Log
{
public function handle($request, \Closure $next)
{
$request->log = 'hello';
return $next($request);
}
}
<?php
/**
* Created by ahai
* Time: 2018/9/27 0027 上午 10:18
* Email: <764882431@qq.com>
*/
namespace app\http\middleware;
Class Check
{
public function handle($request, \Closure $next)
{
$request->check = 'check';
return $next($request);
}
}

转自  http://www.thinkphp.cn/topic/59357.html

thinkphp5.1 中间件是什么,有什么用的更多相关文章

  1. ThinkPHP5.1x 中间件实现原理

    ThinkPHP5.1x的中间件,其核心还是闭包函数的应用,来实现“责任链”模式: 模拟代码: <?php //模拟的控制器 class Controller { public function ...

  2. easywechat微信开发SDK之小微商户进件(一)

    微信本身不提供小微商户进件的SDK,偶然发现easywechat这么个东西,官网地址是https://www.easywechat.com/  整合了微信开发中常用的接口,包括微信公众号相关接口,微信 ...

  3. 使用 Casbin 作为 ThinkPHP 的权限控制中间件

    PHP-Casbin 是一个强大的.高效的开源访问控制框架,它支持基于各种访问控制模型的权限管理. Think-Casbin 是一个专为 ThinkPHP5.1 定制的 Casbin 的扩展包,使开发 ...

  4. 详细解析Thinkphp5.1源码执行入口文件index.php运行过程

    详细解析Thinkphp5.1源码执行入口文件index.php运行过程 运行了public目录下的index.php文件后,tp的运行整个运行过程的解析 入口文件index.php代码如下: < ...

  5. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  6. ASP.NET Core应用的错误处理[3]:ExceptionHandlerMiddleware中间件如何呈现“定制化错误页面”

    DeveloperExceptionPageMiddleware中间件利用呈现出来的错误页面实现抛出异常和当前请求的详细信息以辅助开发人员更好地进行纠错诊断工作,而ExceptionHandlerMi ...

  7. ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”

    在<ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式>中,我们通过几个简单的实例演示了如何呈现一个错误页面,这些错误页面的呈现分别由三个对应的中间件来完成,接下来我们将 ...

  8. ASP.NET Core 中间件之压缩、缓存

    前言 今天给大家介绍一下在 ASP.NET Core 日常开发中用的比较多的两个中间件,它们都是出自于微软的 ASP.NET 团队,他们分别是 Microsoft.AspNetCore.Respons ...

  9. .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法

    .NET Core中间件的注册和管道的构建(3) ---- 使用Map/MapWhen扩展方法 0x00 为什么需要Map(MapWhen)扩展 如果业务逻辑比较简单的话,一条主管道就够了,确实用不到 ...

随机推荐

  1. OpenStack 节点重启后无法联网的问题

    问题 五一归来,大量服务器被重启了,其中一台服务器失联了.通过远程桌面登录之后发现服务器的 IP 地址是 "正常" 的,可以 Ping 通自己的 IP,但 Ping 不同网关. 解 ...

  2. SQL学习(一)相关基础知识

    RDBMS基础知识 1.数据库是按照数据结构来组织.存储和管理数据的仓库:数据库是一些关联表的集合. 2.数据表是数据的矩阵,在一个数据库中的表看起来像一个简单的电子表格. 3.列:一列包含了相同的数 ...

  3. Telnet设置

    修改hostname:修改/etc/hosts文件vi /etc/hosts# Do not remove the following line, or various programs# that ...

  4. Web jsp开发自学——ajax+servlet+echarts+json+gson 实现ajax传输servlert和echarts的数据,可视化结果

    感谢下面的博主,我学习的博客有: https://blog.csdn.net/ITBigGod/article/details/81023802  Jsp+Servlet+Echarts实现动态数据可 ...

  5. Pytorch-创建tensor

    引言 本篇介绍创建tensor的几种方式 Import from numpy from_numpy() float64 是 double 类型,也就是说从numpy导入的float其实是double类 ...

  6. 使用shell脚本常见的一些问题

    Jdk版本:jdk-8u102-linux-x64 Tomcat版本:apache-tomcat-7.0.92 Redis版本:redis-5.0.0 由于公司项目的需要,要在多台服务器上面部署一些应 ...

  7. LeetCode.1108-使IP地址无效(Defanging an IP Address)

    这是小川的第393次更新,第426篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第257题(顺位题号是1108).给定有效(IPv4)IP地址,返回该IP地址的无效版本. ...

  8. upload上传

    1>使用apache第三方控件commons-fileupload实现上传(引入jar包),能够极大的简化实现上传文件的代码量 2>能够实现文件的上传功能,当我们的项目中需要上传图片,文档 ...

  9. meta viewport移动端自适应

    参考链接:https://www.jianshu.com/p/561357d7cd7b

  10. flask_migrate 的应用

    怎么查看的命令: python manage.py --help 使用flask_migrate的注意事项: