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. 【TouchGFX】代码结构

    生成代码与用户代码 代码结构图示如下 据上图显示代码结构分为三层 引擎 这是TouchGFX提供的标准类,作为生成类的基类 生成 这是touchgfx designer生成的类,作为用户类的基类,这部 ...

  2. phpcms - 在删除文章后实现自动删除tag标签

    在使用phpcms程序制作网站的时候,我们会发现文章模型新建一篇文章后会自动向数据库中插入关键词,但如果删除文章后,数据库中的关键词表中字段中还存在之前文章的关键词,那么怎样才能在phpcms后台中删 ...

  3. JVM内存参数的学习之三

    JVM内存参数的学习之三 背景 研究启动性能时, 顺便看到了jmap -heap 1 的部分信息 看到: MinHeapFreeRatio.MaxHeapFreeRatio 自己突然以为是 Perce ...

  4. [转帖]07、kvm虚拟机的克隆

    操作前先关闭虚拟机 虚拟机的克隆 一.命令行克隆virt-clone(方法一) virt-clone -o vm1 -n vm2 -f /kvmdata/vm2.img 参数说明: -o:指定需要被c ...

  5. [转帖]/etc/security/limits.conf 详解与配置

    https://www.cnblogs.com/operationhome/p/11966041.html 一. /etc/security/limits.conf 详解 /etc/security/ ...

  6. [转帖]RAC环境下误操作将数据文件添加到本地存储

    https://www.cnblogs.com/jyzhao/p/7986729.html 今天碰到个有意思的事情,有客户在Oracle RAC环境,误操作将新增的数据文件直接创建到了其中一个节点的本 ...

  7. [转帖]Linux三剑客之sed的初阶使用

    https://www.jianshu.com/p/ceea435635a2 大多数情况下,对于文件内容的修改需要依赖交互式的软件来实现,例如vim修改文件的内容则是依赖光标的移动和修改操作来完成对文 ...

  8. [转帖]PostgreSQL(三) 内存参数优化和原理(work_mem)内存表 pgfincore插件使用方法

    1.常用内存参数 1.1 shared_buffers shared_buffers是PostgreSQL用于共享缓冲区的内存,是由8kb大小的块所形成的数组.PostgreSQL在进行更新.查询等操 ...

  9. [转帖]无需 zookeeper 安装 kafka 集群 (kakfa3.0 版本)

    https://xie.infoq.cn/article/7769ef4576a165f7bdf142aa3 一.kafka 集群实例角色规划 在 kafka3.0 中已经可以将 zookeeper ...

  10. [转帖]find排除一个或多个目录的方法

    find排除一个或多个目录的方法 百度就是垃圾,搜索结果千篇一律,错抄错.google一下,总结find排除某个目录的方法: How to exclude a directory in find . ...