(学习笔记)laravel 中间件

laravel的请求在进入逻辑处理之前会通过http中间件进行处理。

也就是说http请求的逻辑是这样的:

建立中间件

首先,通过Artisan命令建立一个中间件。

php artisan make:middleware [中间件名称]

例如我创建一个叫做 TestMiddleware的中间件。

php artisan make:middleware TestMiddleware

这样我们就会在app/http/middleware目录下看到我们在建立的中间件

注册中间件

中间件可以是针对route的也可以是针对所有http请求的。

在注册中间件时这两种有一定不同。

针对都有http请求

如果中间件在每一个HTTP请求期间都被执行,只需要将相应的中间件类设置到 app/Http/Kernel.php 的数组属性 $middleware 中即可。

如下:

    protected $middleware = [
//这是自带的例子
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
//这是我注册的中间件
\App\Http\Middleware\TestMiddleware::class,
];

针对特定route

对于针对特定route的中间件。

app/Http/Kernel.php 类的 $routeMiddleware 属性包含了 Laravel 内置的入口中间件,在其中添加你自己的中间件只需要将其追加到后面并为其分配一个简写的key:

protected $routeMiddleware = [
//这是自带的例子
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'can' => \Illuminate\Auth\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
//这是我注册的中间件
'test' => \App\Http\Middleware\TestMiddleware::class,
];

在注册完中间件后就要开始绑定中间件到route。

绑定route有两种方法。

第一种是通过数组分配

Route::get('/', ['middleware' => ['first', 'second'], function () {
//
}]);

第二种是通过方法链来分配

Route::get('/', function () {
//
})->middleware(['first', 'second']);

同时,也可以在Controller中调用中间件,就是在Controller的构造方法中调用:

//Controller的构造方法
public function __construct()
{
//调用中间件
$this->middleware('test');
}

这样我们就能使用中间件了

中间件代码分析

中间件可以实现啊很多功能,例如权限验证,访问记录,重定向等等。

具体干什么看自己想法。

中间件在请求阶段会调用自己的handle()方法

同时中间件也可以在响应阶段使用,这时,会掉用它的terminate()方法。

所以,当需要在响应发出后使用中间件只需要重写terminate()方法即可。

<?php

namespace App\Http\Middleware;

use Closure;

class TestMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
return $next($request);
}
public function terminate($request, $response)
{
//这里是响应后调用的方法
}
}

handle()方法

handle()方法有两个参数

$request --->请求信息,里面包含了输入,URL,上传文件等等信息。

$next --->闭包函数。我的理解是将接下来需要执行的逻辑装载到了其中。

返回值:

通过上文对参数的描述可以了解到:

当我们在中间件中return $next($request);时,相当与把请求传入接下来的逻辑中。

同时,中间件也可以返回重定向,不运行之前的逻辑。

例如,希望将页面重定向到'/welcome'的页面return redirect('welcome').

注意,这里是重定向到"/welcome"这个地址的route而不是"welcome"这个页面(view)。

terminate()方法

参数

$request --->请求信息,里面包含了输入,URL,上传文件等等信息。

$response -->响应消息,包含了逻辑处理完成后传出到的响应消息。

因为terminate()方法只是在响应后进行一些处理所以没有返回值。

(学习笔记)laravel 中间件的更多相关文章

  1. Asp .Net core 2 学习笔记(2) —— 中间件

    这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源: ASP.NET Core 中文文档目录 官方文档 记在这里的东西我会不断的完善丰满,对于文章 ...

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

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

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

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

  4. Laravel学习笔记(三)--在CentOS上配置Laravel

    在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚.     今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下.     1)系统 ...

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

    说明:在中篇中学习了session的CRUD增删改查操作,本篇主要学习关闭session的相关源码.实际上,在Laravel5.3中关闭session主要包括两个过程:保存当前URL到session介 ...

  6. Laravel学习笔记之Session源码解析(中)

    说明:在上篇中学习了session的启动过程,主要分为两步,一是session的实例化,即\Illuminate\Session\Store的实例化:二是从session存储介质redis中读取id ...

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

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

  8. Laravel学习笔记之PHP反射(Reflection) (上)

    Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读  ·  读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...

  9. laravel 学习笔记 — 神奇的服务容器

     2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...

随机推荐

  1. 免费道路 bzoj 3624

    免费道路(1s 128MB)roads [输入样例] 5 7 21 3 04 5 13 2 05 3 14 3 01 2 14 2 1 [输出样例] 3 2 04 3 05 3 11 2 1 题解: ...

  2. Node.js 教程 01 - 简介、安装及配置

    系列目录: Node.js 教程 01 - 简介.安装及配置 Node.js 教程 02 - 经典的Hello World Node.js 教程 03 - 创建HTTP服务器 Node.js 教程 0 ...

  3. mysql 行级锁的使用以及死锁的预防

    一.前言 mysql的InnoDB,支持事务和行级锁,可以使用行锁来处理用户提现等业务.使用mysql锁的时候有时候会出现死锁,要做好死锁的预防. 二.MySQL行级锁 行级锁又分共享锁和排他锁. 共 ...

  4. Linux-Rhel6 恢复误删文件

    需要工具extundelete(可通过xshell上传下载到linux)知识点:ifconifig eth0             查看ipfdisk /dev/sda          管理磁盘m ...

  5. 小知识:C#可选参数的一个陷阱

    一.背景: 互联网行业,为了降低程序维护.升级的部署风险,往往会将程序拆分成很多项目,编译成多个dll部署,这样发布的时候,只需要部署修改过的dll即可.   二.问题: 有一个函数,在很多个地方被使 ...

  6. 【.NET深呼吸】Zip文件操作(1):创建和读取zip文档

    .net的IO操作支持对zip文件的创建.读写和更新.使用起来也比较简单,.net的一向作风,东西都准备好了,至于如何使用,请看着办. 要对zip文件进行操作,主要用到以下三个类: 1.ZipFile ...

  7. owner:轻松管理java项目配置

    前段时间,一同事说在 github 上“活捉了”一个很有趣的开源项目,它是一个超轻量级的 jar 包,能够帮助你在 java 项目中摒弃样板式的 properties 配置代码,让你轻松自如地管理和使 ...

  8. SQL Server-聚焦使用索引和查询执行计划(五)

    前言 上一篇我们讲了聚集索引对非聚集索引的影响,对数据库一直在强调的性能优化,所以这一节我们统筹讲讲利用索引来看看查询执行计划是怎样的,简短的内容,深入的理解,Always to review the ...

  9. 定时管理器框架-Task.MainForm

    入住博客园4年多了,一直都是看别人的博客,学习别人的知识,为各个默默无私贡献自己技术总结的朋友们顶一个:这几天突然觉得是时候加入该队列中,贡献出自己微弱的力量,努力做到每个月有不同学习总结,知识学习的 ...

  10. Django:手把手带你入门

    一.开发环境: Python:2.7:PyCharm 4 二.Django的安装: 打开Pycharm --> 新建项目--> 看图操作--> 自动安装Django环境 三.创建第一 ...