(学习笔记)laravel 中间件
(学习笔记)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 中间件的更多相关文章
- Asp .Net core 2 学习笔记(2) —— 中间件
这个系列的初衷是便于自己总结与回顾,把笔记本上面的东西转移到这里,态度不由得谨慎许多,下面是我参考的资源: ASP.NET Core 中文文档目录 官方文档 记在这里的东西我会不断的完善丰满,对于文章 ...
- Laravel学习笔记之Session源码解析(上)
说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助.Laravel在web middleware中定义了 ...
- NodeJS学习笔记之Connect中间件模块(一)
NodeJS学习笔记之Connect中间件模块(一) http://www.jb51.net/article/60430.htm NodeJS学习笔记之Connect中间件模块(二) http://w ...
- Laravel学习笔记(三)--在CentOS上配置Laravel
在Laravel框架上开发了几天,不得不说,确实比较优雅,处理问题逻辑比较清楚. 今天打算在CentOS 7上配置一个Laravel,之前都是在本机上开发,打算实际配置一下. 1)系统 ...
- Laravel学习笔记之Session源码解析(下)
说明:在中篇中学习了session的CRUD增删改查操作,本篇主要学习关闭session的相关源码.实际上,在Laravel5.3中关闭session主要包括两个过程:保存当前URL到session介 ...
- Laravel学习笔记之Session源码解析(中)
说明:在上篇中学习了session的启动过程,主要分为两步,一是session的实例化,即\Illuminate\Session\Store的实例化:二是从session存储介质redis中读取id ...
- Django学习笔记(15)——中间件
当Django处理一个Request的过程是首先通过中间件,然后再通过默认的URL方式进行的.我们可以在Middleware这个地方把所有Request拦截住,用我们自己的方式完成处理以后直接返回Re ...
- Laravel学习笔记之PHP反射(Reflection) (上)
Laravel学习笔记之PHP反射(Reflection) (上) laravel php reflect 2.1k 次阅读 · 读完需要 80 分钟 3 说明:Laravel中经常使用PHP的反 ...
- laravel 学习笔记 — 神奇的服务容器
2015-05-05 14:24 来自于分类 笔记 Laravel PHP开发 竟然有人认为我是抄 Laravel 学院的,心塞.世界观已崩塌. 容器,字面上理解就是装东西的东西.常见的变量.对象属 ...
随机推荐
- 【JavaScript】innerHTML、innerText和outerHTML的用法区别
用法: <div id="test"> <span style="color:red">test1</span> tes ...
- Android系统默认对话框添加图片
开发工具Android Studio 今天公司UI要求软件对话框改成加图片的,以前没有做过,所以就学习了一下,废话不多说, 看效果: 创建XML文件dialog_lsit_item.xml <L ...
- Xamarin Android 应用程序内图标上数字提示
最近在用 Xamarin 做一个 Android 应用,打开应用时,如果有新消息,需要在应用内的 Toolbar 或者首页的图标上显示数字提示.在这里和大家分享一下实现方法,如果你有更新好的实现方法, ...
- ionic第一坑——ion-slide-box坑(ion-slide分两页的坑)
ionic.views.Slider = ionic.views.View.inherit({ initialize: function (options) { . . . function setu ...
- Atitit.你这些项目不都是模板吗?不是原创 集成和整合的方式大总结
Atitit.你这些项目不都是模板吗?不是原创 集成和整合的方式大总结 1.1. 乔布斯的名言:创新即整合(Creativity is just connecting things).1 1.2. ...
- Alwayson的IP冲突
Alwayson的IP冲突 https://social.technet.microsoft.com/Forums/office/en-US/4d50cb1c-eef7-4dcc-b937-3c8eb ...
- EQueue 2.3.2版本发布(支持高可用)
前言 前段时间针对EQueue的完善终于告一段落了,实在值得庆祝,自己的付出和坚持总算有了成果.这次新版本主要为EQueue实现了集群功能,基本实现了Broker的高可用.另外还增加了很多实用的功能, ...
- Web API 强势入门指南
Web API是一个比较宽泛的概念.这里我们提到Web API特指ASP.NET Web API. 这篇文章中我们主要介绍Web API的主要功能以及与其他同类型框架的对比,最后通过一些相对复杂的实例 ...
- webstorm license key
JetBrains WebStorm注册码 UserName: William License Key : ===== LICENSE BEGIN ===== 45550-12042010 00001 ...
- 在春意盎然的季节里初识GIT
Git 与 SVN 区别 GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等. 如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征. ...