(学习笔记)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. BPM配置故事之案例6-条件可见与条件必填

    小明兴奋的告诉大毛自己独立解决了必填和水印问题,腹黑的大毛决定给小明出一个进阶问题刷一下存在感. 大毛:我再考考你,我把表单改成了这样(下图).怎么做到,预算状态为"预算内"时,不 ...

  2. [OC] NSURLSession

    有的程序员老了,还没听过NSURLSession 有的程序员还嫩,没用过NSURLConnection 有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSUR ...

  3. 解决:win10_x64 VMware Workstation and Hyper-V are not compatible. Remove the Hyper-V role from the system before running VMware Workstation

    bcdedit /set hypervisorlaunchtype off A reboot of of the Windows OS is necessary  必须重启才能生效   To enab ...

  4. 一步步开发自己的博客 .NET版(3、注册登录功能)

    前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做 ...

  5. .Net中的AOP系列之《单元测试切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 使用NUnit编写测试 编写和运行NUnit测试 切面的测试策略 Castle DynamicProxy测试 测试一个拦截器 注入依赖 ...

  6. 自动添加Linux登录账户,并授予sudo权限

    #!/bin/bash USER=test PASS=$USER GROUP=root HOME=/data/home/$USER # if user not exist if [[ $(cat /e ...

  7. ABP源码分析三十三:ABP.Web

    ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事一,在A ...

  8. The type javax.ws.rs.core.MediaType cannot be resolved. It is indirectly referenced from required .class files

    看到了http://stackoverflow.com/questions/5547162/eclipse-error-indirectly-referenced-from-required-clas ...

  9. Atitit 图像处理的摩西五经attilax总结

    Atitit 图像处理的摩西五经attilax总结 1. 数字图像处理(第三版)1 2. 图像处理基础(第2版)(世界著名计算机教材精选)1 3. 计算机视觉特征提取与图像处理(第三版)2 4. Op ...

  10. SQL-从数据类型 varchar 转换为 bigint 时出错的解决方案

    解决