Laravel框架中引入了“中间件”这个概念,笔者觉得不是太合适。这里的Middleware和Java Servlet中的过滤器(Filter)就是一个东西,但是想比之下Filter这个词更容易理解一些。当然,为了入乡随俗,我们在这里也称这东西为“中间件”。

中间件的作用其实很简单,很明了:在业务行为之前先做点事情(前中间件)-->执行业务行为-->再做点其它事件(后中间件)。让我们来张灵魂画图:

所以,我们现在需要解决下面两个问题:创建和配置。

1、中间件的创建

在项目根目录下,执行php artisan make:middleware TestMidWare,就可以在/app/Http/Middleware下就自动生成了一个TestMidWare.php文件,里面有个TestMidWare类,原始代码如下:

2、中间件的使用

既然现在中间件类已经创建出来了,我们就开始讨论怎么让这个类生效。注册中间件,让中间件起作用,我们在这里讨论两种很常见的方式:全局中间件 和 路由中间件。

无论是哪一种中间件,都要在/app/Http/Kernel.php中注册,才可以生效。

(1) 全局中间件

Kernel.php文件中有一个名为$middleware的数组,只要将我们的中间件类(例上上面的TestMidWare)写在这个数组中,就会对所有的业务流程生效,如下图:

 (2)路由中间件

在Kernel.php文件中有一个名为$routeMiddleware的数组,将中间件类写在这个数组中(要以key=>value的形式),并且在路由中指定,就可以生效,如下图:

接着,我们在路由中指定这个中间件:

这时当我们访问http://域名/hello/id的时候,在MyController@hello的业务生效前后,CrossDomain中间件就会起作用。

3、前/后中间件

无论是前中间件还是后中间件,本质都是中间件,创建和注册的方法都完全一样。只是代码在中间件类里的位置不一样而已。一个中间件可以同时是前中间件和后中间件。代码如下所示:

namespace App\Http\Middleware;

use Closure;

class TestMidWare
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
//A 前中间件代码
$response=$next($request); //业务流程,流转到下一个中间件,或者业务处理函数
//B 后中间件代码 return $response;
}
}

代码写在A部分,这个中间件就是前中间件;代码写在B部分,这个中间件就是后中间件;如果A和B两个部分都写,那么这个中间件既是前中间件,也是后中间件。

4、其他

到了这里,中间件的使用方法就告一段落了。下面举个中间件使用的例子,我的代码需要实现跨域,所有的API响应之前都要输出跨域的header,所以我选用了中间件来处理:

<?php

namespace App\Http\Middleware;

use Closure;

class CrossDomain
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
$response=$next($request); $response->header('Access-Control-Allow-Origin', "*");
$response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN');
$response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
$response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
$response->header('Access-Control-Allow-Credentials', 'true'); return $response;
}
}

中间件的话题到这里结束,上面是最最常用的中间件知识点。当然,中间件还有其他的话题:中间件组、终端中间件、中间件参数,这些大家就参考官方手册吧。

下回见咯:)

---------------------------  我是可爱的分割线  ----------------------------

最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

Laravel入坑指南(7)——中间件Middleware的更多相关文章

  1. electron入坑指南

    electron入坑指南 简介 electron 实际集成chrome浏览器和node环境, 运行你写的网页 app 基本目录结构 index.html 名称可以不是index, 这个文件与普通网页的 ...

  2. C语言入坑指南-被遗忘的初始化

    前言 什么是初始化?为什么要初始化?静态变量和局部变量的初始化又有什么区别?实际应用中应该怎么做?本文将一一回答这些问题. 什么是初始化 初始化指的是对数据对象或者变量赋予初始值.例如: int va ...

  3. Elasticsearch入坑指南之RESTful API

    Elasticsearch入坑指南之RESTful API Tags:Elasticsearch ES为开发者提供了非常丰富的基于Http协议的Rest API,通过简单的Rest请求,就可以实现非常 ...

  4. ElasticSearch入坑指南之概述及安装

    ---恢复内容开始--- ElasticSearch入坑指南之概述及安装 了解ElasticSearch ElasticSearch(简称ES)基于Lucene的分布式全文检索引擎.使用ES可以实现近 ...

  5. eclipse中导入外部包却无法查看对应源码或Javadoc的入坑指南

    eclipse中导入外部包却无法查看对应源码或Javadoc的 入坑指南 出现这个错误的原因是,你虽然导入了.jar包,但没有配置对应的Javadoc或源码路径,所以在编辑器中无法查看源 码和对应AP ...

  6. Rust入坑指南:核心概念

    如果说前面的坑我们一直在用小铲子挖的话,那么今天的坑就是用挖掘机挖的. 今天要介绍的是Rust的一个核心概念:Ownership.全文将分为什么是Ownership以及Ownership的传递类型两部 ...

  7. Rust入坑指南:鳞次栉比

    很久没有挖Rust的坑啦,今天来挖一些排列整齐的坑.没错,就是要介绍一些集合类型的数据类型."鳞次栉比"这个标题是不是显得很有文化? 在Rust入坑指南:常规套路一文中我们已经介绍 ...

  8. Rust入坑指南:亡羊补牢

    如果你已经开始学习Rust,相信你已经体会过Rust编译器的强大.它可以帮助你避免程序中的大部分错误,但是编译器也不是万能的,如果程序写的不恰当,还是会发生错误,让程序崩溃.所以今天我们就来聊一聊Ru ...

  9. Rust入坑指南:朝生暮死

    今天想和大家一起把我们之前挖的坑再刨深一些.在Java中,一个对象能存活多久全靠JVM来决定,程序员并不需要去关心对象的生命周期,但是在Rust中就大不相同,一个对象从生到死我们都需要掌握的很清楚. ...

  10. Rust入坑指南:齐头并进(上)

    我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级.为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外. 聊到并发,就离不开多进程和多线程这两个概念. ...

随机推荐

  1. 【css】 text-align 居中导航

    原理 :利用 inline-block 将 导航 作为 文本 , 被外层具有 text-align 属性的导航盒子包含 .从而实现居中效果 1.  html 结构 <header> < ...

  2. 常见的IE布局兼容问题

    (1)  div 中内容在IE和火狐中居中问题: (2)高度的问题,div出现重叠 (3)浮动引发的问题如外围DIV无法框住内部元素: (4)IE浮动margin产生双倍距离-display:inli ...

  3. STM32CubeMX教程23 FSMC - IS62WV51216(SRAM)驱动

    1.准备材料 开发板(正点原子stm32f407探索者开发板V2.4) STM32CubeMX软件(Version 6.10.0) 野火DAP仿真器 keil µVision5 IDE(MDK-Arm ...

  4. [转帖]nginx优化配置及方法论

    https://www.jianshu.com/p/87f8c03e91bd 1.优化方法论 从软件层面提升硬件使用效率 增大CPU的利用率 增大内存的利用率 增大磁盘IO的利用率 增大网络带宽的利用 ...

  5. [转帖]Linux命令(64)——strings命令

    https://cloud.tencent.com/developer/article/1414999 1.命令简介 strings命令是二进制工具集GNU Binutils的一员,用于打印文件中可打 ...

  6. [转帖]Linux如何查看网关地址

      转至:https://baijiahao.baidu.com/s?id=1733537078943023051&wfr=spider&for=pc 服务器之间的通信是通过ip地址来 ...

  7. CentOS8 的容器运行时解决中文乱码问题的一个思路

    首先说明一下 CentOS7和CentOS8关于locale语言文件的位置是不一样的. Docker pull centos 拉取下来的镜像 一般是不带中文语言包的. 简单方法是在 CentOS之后安 ...

  8. VOP 消息仓库演进之路|如何设计一个亿级企业消息平台

    作者:京东零售 李孟冬 VOP作为京东企业业务对外的API对接采购供应链解决方案平台,一直致力于从企业采购数字化领域出发,发挥京东数智化供应链能力,通过产业链上下游耦合与链接,有效助力企业客户的成本优 ...

  9. 【小测试】玩一玩 VictoriaMetrics 的 force merge

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 我是期望通过备份来建立 VictoriaMetrics 的 ...

  10. 基于spring security创建基本项目框架

    SpringBoot建项目步骤 建表 新建项目 (package name可以自定义,整个项目只能在该包下) 选择可能有到的依赖 (别忘了勾选SQL中的Mybatis Framework,创建项目 如 ...