Laravel提供了中间件的使用。那什么是中间件呢,根据用法,我总结为,夹在“请求—>控制器—>响应—>end”中间运行的代码片段。本文将以官方英文文本为基础资料进行笔记记录。
Laravel V5.3 middleware : https://laravel-china.org/docs/en/5.3/middleware


一. 使用入门

本人觉得常用的就是在”请求–>控制器”这个流程中插入中间执行代码。
首先,需要创建中间件,如:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
class Test
{
public function handle($request, Closure $next, $guard = null)
{
echo "this is middleware named test <br/>";
return $next($request);
}
}

注意这里需要执行的代码放在 handle方法中,该方法的形参中的“$request”是请求类,”$next”是流水线(流水线式laravel框架的一个核心流程概念,有兴趣可去看源码,里面的类叫pipeLine)中下一个需要运行的闭包函数。

然后,就是为自己定义的路由注册中间件,在app/Http/Kernel.php中,写上如下代码:
(注意:以下用法中间件在控制器实例之后,具体行为之前执行)

protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'test_mid' => \App\Http\Middleware\Test::class, //在后面添加自己自定义的中间件
];

最后,就是在路由的定义那里使用middleware方法进行绑定:

Route::get('/', function () {
return "hello <br/>";
})->middleware('test_mid');

配置完了,当在浏览器中输入如下网址时:

http://Host/

于是,就输出:

this is middleware named test
hello

二. 结尾中间件(Terminable Middleware)

在控制器前可以添加中间件,那么再控制器后也可以添加结尾中间件,使用相当简单,就是在自定义中间件里定义terminate函数,如下:
(注意:以下用法中间件在控制器行为之后执行)

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth; class Test
{
public function handle($request, Closure $next, $guard = null)
{
echo "this is middleware named test <br/>";
return $next($request);
} public function terminate($request, $response)
{
echo "this is terminate middleware named test <br/>";
}
}

其它步骤和“一”中说的一致,然后输入网址后,输出:

this is middleware named test
hello
this is terminate middleware named test

三. 中间件更加灵活的用法

如果希望所有路由都执行同一个自定义中间件,就在app/Http/Kernel.php中的middleware 数组添加自定义项,如:
(注意:以下用法中间件在控制器实例化之前执行)

/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\App\Http\Middleware\Test::class,
];

或者,希望一个路由能够同时使用多个中间件,就在app/Http/Kernel.php中的middlewareGroups数组添加自定义项,如:

protected $middlewareGroups = [
'testMG' => [
\App\Http\Middleware\Test::class,
中间件2,
中间件3
]
];

然后,在路由定义时,如下使用:

Route::get('/', function () {
return "hello <br/>";
})->middleware('testMG');

或者,希望某个路由在使用中间件时,能携带一个参数(目前只支持一个字符串参数【json时就可以表示对象了】),就要在路由定义时,如下使用:

Route::get('/', function () {
return "hello <br/>";
})->middleware('test:myParams'); //冒号前就是注册的中间件的名字,冒号后就是参数了

然后,中间件的handle函数中,第三个形参,就是用来接收“myParams”这个传递过来的字符串的。

或者如果想再控制器中定义中间件,可以在控制器的构造函数中这样写:

class  TestController extends Controller{

    public function __construct()
{
$this->middleware('中间件名字1');
$this->middleware('中间件名字2');
} }
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Gavin_new/article/details/53492296

Laravel5.3使用学习笔记---中间件的更多相关文章

  1. PHP典型功能与Laravel5框架开发学习笔记

    步骤一:PHP的Redis应用及HTTP协议 一.Redis初识 1.Linux下安装redis:具体看官网:https://redis.io/download:以下为以个人习惯的安装目录进行的red ...

  2. (学习笔记)laravel 中间件

    (学习笔记)laravel 中间件 laravel的请求在进入逻辑处理之前会通过http中间件进行处理. 也就是说http请求的逻辑是这样的: 建立中间件 首先,通过Artisan命令建立一个中间件. ...

  3. NodeJS学习笔记之Connect中间件模块(一)

    NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...

  4. Django学习笔记(15)——中间件

    当Django处理一个Request的过程是首先通过中间件,然后再通过默认的URL方式进行的.我们可以在Middleware这个地方把所有Request拦截住,用我们自己的方式完成处理以后直接返回Re ...

  5. Laravel学习笔记之Session源码解析(上)

    说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...

  6. TP6学习笔记一:安装与基本配置

    1 说明与概述 1.1 说明 以下内容大部分来源于TP6完全开发手册,以手册为主附上个人理解,仅作学习使用. 1.2 概述 第一篇学习笔记,主要记录TP6的基础,包括TP6简介,安装,Hello Wo ...

  7. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  8. WeX5学习笔记

    目录 WeX5学习笔记... 1 1.轻松看透WeX5产品能力和技术... 1 2.WeX5可以怎么玩?... 3 一.纯本地App. 3 二.关联一个网站,希望默认就打开某页... 4 三.UI设计 ...

  9. 【原】redux异步操作学习笔记

    摘要: 发觉在学习react的生态链中,react+react-router+webpack+es6+fetch等等这些都基本搞懂的差不多了,可以应用到实战当中,唯独这个redux还不能,学习redu ...

随机推荐

  1. 50道python面试题

    1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in file 2.迭代器和生成器的区别 1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方 ...

  2. Ajax中post方法400和404的问题

    1.从400变成404 我相信有很多人都用过Ajax技术来获取数据,一般都是使用get来获取的,但是敏感信息就不能继续用get了,于是就换成了post,但是用post的时候有时候发生一些奇怪的事情,比 ...

  3. Leetcode704.Binary Search二分查找

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: num ...

  4. uml设计之多重性

    ---------------------------------------------------------------------------------------------------- ...

  5. 怎样做一个iOS App的启动分层引导动画?

    一. 为什么要写这篇文章? 这是一个很古老的话题,从两年前新浪微博开始使用多层动画制作iOS App的启动引导页让人眼前一亮(当然,微博是不是历史第一个这个问题值得商榷)之后,各种类型的引导页层出不穷 ...

  6. 连接池dbcp

    连接池dbcp DBCP:apache组织 使用步骤: 1.导入jar包(commons-dbcp-1.4.jar和commons-pool-1.5.6.jar.commons-logging-1.2 ...

  7. oracle如何看审计的结果

    1)数据库初始化参数文件中AUDIT_TRAIL=OS时,审计记录存在操作系统的文件中. UNIX系统的话,默认存在“$oracle_home/rdbms/audit/” 目录下. If you ha ...

  8. 阿里巴巴资深技术专家无相:我们能从 InteliJ IDEA 中学到什么?

    本文来源于阿里巴巴资深技术专家无相在内网的分享,阿里巴巴中间件受权发布. 最近因为工作的关系,要将 Eclipse 的插件升级为 IDEA 插件.升级过程中,对 IDEA 插件做了些学习和研究,希望通 ...

  9. javaScript之split与join的区别

    共同点: split与join函数通常都是对字符或字符串的操作: 两者的区别: split() 用于分割字符串,返回一个数组,例如 var str="How are you doing to ...

  10. Java练习 SDUT-2733_小鑫の日常系列故事(二)——石头剪子布

    小鑫の日常系列故事(二)--石头剪子布 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小鑫在上幼儿园的时候,喜欢跟小伙 ...