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

中间件主要用于拦截或过滤应用的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. Failed to install the following Android SDK packages as some licences have not been accepted.

    问题描述: 执行gradle tasks报错: gradle tasks > Configure project :app Exception /package.xml. Probably th ...

  2. 小D课堂 - 新版本微服务springcloud+Docker教程_3-02CAP理论知识

    笔记 2.分布式应用知识CAP理论知识     简介:讲解分布式核心知识CAP理论 CAP定理:             指的是在一个分布式系统中,Consistency(一致性). Availabi ...

  3. fastjson反序列化LocalDateTime失败的问题java.time.format.DateTimeParseException: Text '2019-05-24 13:52:11' could not be parsed at index 10

    本地java类 import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime; ...

  4. python获取内存地址上存储的值

    在python中,可以通过id()这个方法来获取对象的内存地址. 但是反过来,怎么获取内存地址上存储的值? 先看一段代码: from ctypes import string_at from sys ...

  5. Leetcode之动态规划(DP)专题-413. 等差数列划分(Arithmetic Slices)

    Leetcode之动态规划(DP)专题-413. 等差数列划分(Arithmetic Slices) 如果一个数列至少有三个元素,并且任意两个相邻元素之差相同,则称该数列为等差数列. 例如,以下数列为 ...

  6. 思科设备自动退出配置界面、打断命令输入、禁用DNS查询

    1.自动退出配置界面 问题及原因:当设备没有被操作,空闲一段时间后,控制台回到初始化界面.控制台默认会话时间为10分钟,过期后跳转初始化界面 解决办法:配置控制台永不超时 Switch(config) ...

  7. dll的封装和使用

    背景 在windows平台下,要实现函数的封装,一般采用的是dll动态库的形式 实现了函数的封装就意味着实现过程的隐藏 可以实现跨平台和跨语言的使用 实施步骤 生成dll动态库 在VS中生成新项目,应 ...

  8. 图解DMZ

    图解DMZ 1. 概念介绍 DMZ是英文“demilitarized zone”的缩写,中文译为“隔离区”.“非军事区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安 ...

  9. python 爬虫 基于requests模块的get请求

    需求:爬取搜狗首页的页面数据 import requests # 1.指定url url = 'https://www.sogou.com/' # 2.发起get请求:get方法会返回请求成功的响应对 ...

  10. 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》

    前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...