Laravel 中间件是什么?

简而言之,中间件在 laravel 中的作用就是过滤 HTTP 请求,根据不同的请求来执行不同的逻辑操作。

我们可以通过中间件实现以下功能:

  • 指定某些路由

  • 设置 HTTP 响应头

  • 记录请求

  • 过滤请求的参数

  • 决定是否启用站点维护模式

  • 响应前后做一些必要的操作

自定义中间件

命令行执行下面的简单命令,就可以轻松创建一个新的中间件

php artisan make:middleware <MiddlewareName>

//MiddlewareName 就是你要创建的中间件的名字

执行上面的命令,Laravel 会在 app/Http/Middleware 目录下自动创建一个只包含 handle 方法的中间件。

php

namespace App\Http\Middleware;

use Closure;

class RedirectIfSuperAdmin

{

/**

* Handle an incoming request.

*

* @param \Illuminate\Http\Request $request

* @param \Closure $next

* @return mixed

*/

public function handle($request, Closure $next)

{

return $next($request);

}

}

在中间件被调用的时候, handle 方法就会执行。这里需要注意的是 handle 方法默认有两个参数$request 和 $next$request 用来接受应用的请求组求, $next 将请求传递给应用程序。这两个参数是 handle 必不可少的!中间件也包括前置中间件和后置中间件。

“前置中间件” 顾名思义在将请求转发到应用程序之前处理一些逻辑。另一方面,在中间件之后,在应用程序处理了请求并生成响应之后运行。

前置中间件:

php

namespace App\Http\Middleware;

use Closure;

class RedirectIfSuperAdmin

{

/**

* Handle an incoming request.

*

* @param \Illuminate\Http\Request $request

* @param \Closure $next

* @return mixed

*/

public function handle($request, Closure $next)

{

//你的逻辑就在这里

return $next($request);

}

}

后置中间件:

php

namespace App\Http\Middleware;

use Closure;

class RedirectIfSuperAdmin

{

/**

* Handle an incoming request.

*

* @param \Illuminate\Http\Request $request

* @param \Closure $next

* @return mixed

*/

public function handle($request, Closure $next)

{

$response = $next($request);

//你的逻辑就在这里 例如 重定向到 `/`

return $response;

}

}

中间件的类别

  • 全局中间件

  • 路由中间件

全局中间件针对命中应用程序的每个请求运行。Laravel 自带了大多数这些中间件例如 ValidatePostSize, TrimStrings, CheckForMaintenanceMode 等等.

路由中间件仅在它们所连接的路由上运行 例如 redirectIfAuthenticated.

注册中间件

创建的任何中间件都必须注册,因为这是 Laravel 知道存在的唯一方式。要注册中间件,只需打开名为 kernel.php 的文件,该文件位于 Http 文件夹中,如下所示:

This file contains list of all registered middlewares that come with Laravel by default. it contains three major arrays which 此文件包含默认 Laravel 提供的所有已注册中间件的列表。它包含三个主要的中间件组 $middleware , $middlewareGroups 和 $routeMiddleware

php

namespace App\Http;

use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel

{

/**

* 应用程序的全局HTTP中间件。

*

* 这些中间件在应用程序的每个请求期间运行。

*

* @var array

*/

protected $middleware = [

\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,

\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,

\App\Http\Middleware\TrimStrings::class,

\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,

\App\Http\Middleware\TrustProxies::class,

];

/**

* 应用程序的路由中间件组.

*

* @var array

*/

protected $middlewareGroups = [

'web' => [

\App\Http\Middleware\EncryptCookies::class,

\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,

\Illuminate\Session\Middleware\StartSession::class,

// \Illuminate\Session\Middleware\AuthenticateSession::class,

\Illuminate\View\Middleware\ShareErrorsFromSession::class,

\App\Http\Middleware\VerifyCsrfToken::class,

\Illuminate\Routing\Middleware\SubstituteBindings::class,

],

'api' => [

'throttle:60,1',

'bindings',

],

];

/**

* 应用程序的路由中间件.

*

* 可以将这些中间件分配给组或单独使用。

*

* @var array

*/

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,

//the just created middlware

'superadmin' => \App\Http\Middleware\RedirectIfSuperAdmin::class,

];

}

$middleware 数组包含全局中间件,它运行应用程序的每个HTTP请求,所以如果你想为每个请求运行一个中间件,你应该在这里注册它。$middlewareGroups 使得可以在组中注册中间件,从而更容易通过使用组名将大量中间件附加到路由。$routeMiddleware 数组包含各个注册的路由中间件。

分配中间件

有两个主要方法可以把注册好的中间件应用到路由中。

  • 通过控制器的构造方法

  • 通过路由

通过构造方法分配中间件

通过构造方法分配中间有很大的灵活性,它提供了两个重要的方法 except($parameters) 和 only($parameters),这两个方法可以允许或阻止中间件应用到控制器中的辅助方法。不使用这两个方法,中间件将使用与控制器的每个方法。

php

use Illuminate\Http\Request;

class ForumController extends Controller

{

public function __construct(){

/**in this case the middleware named auth is applied

to every single function within this controller

*/

$this->middleware('auth');

}

public function viewForum(){

return view('index');

}

public function edit($id){

}

public function delete($id){

}

}

使用 except 和 only 方法我们可以选择把中间件应用到指定方法。

php

use Illuminate\Http\Request;

class ForumController extends Controller

{

public function __construct(){

/**the authentication middleware here applies to all functions but

viewForums() and viewForumDetails() and the opposite of this happens

when you use only()

*/

$this->middleware('auth')->except(['viewForums', 'viewForumDetails']);

}

public function viewForums(){

return view('index');

}

public function edit($id){

}

public function delete($id){

}

public function viewForumDetails(){

}

}

通过路由分配中间件

如果注册的中间件可以直接附加到路由,如下所示:

php

//方法 1

Route::get('admin/profile', function () {

//action

})->middleware('auth');

/**方法 2

或者像这样使用完全限定的类名:

*/

use App\Http\Middleware\CheckAge;

Route::get('admin/profile', function () {

// action

})->middleware(CheckAge::class);

//方法 3

Route::group(['middleware' => ['web']], function () {

//action

});

N:B 中间件组可以像单个中间件一样分配给路由

中间件参数

其他参数可以传递给中间件。典型示例是将每个用户ID分配给角色,中间件检查用户的角色以确定是否有权访问所请求的 URI。参数可以传递给中间件,如下所示:

php

//方法1 (Through route)

Route::get('admin/profile', function () {

//action

})->middleware('auth:'); // 这里应该被用户想要传递的任何参数替换。

//方法2 (Through a controller)

use Illuminate\Http\Request;

class ForumController extends Controller

{

public function __construct(){

$this->middleware('auth:');

}

}

通过用逗号分隔每个参数,可以将多个参数传递给中间件。

php

Route::get('admin/profile', function () {

//action

})->middleware('auth:,,'); //, , 这里应该被用户想要传递的任何参数替换。

这些参数在 $next 变量之后传递给中间件的 handle 函数

php

class RedirectIfSuperAdmin

{

/**

* Handle an incoming request.

*

* @param \Illuminate\Http\Request $request

* @param \Closure $next

* @return mixed

*/

public function handle($request, Closure $next, $role, $age, $country)

{

//使用解析参数的中间件逻辑

return $next($request);

}

}

总结

要创建中间件,请执行以下过程

  • 使用 artisan 命令创建中间件 php artisan make:middleware中间件名.

  • 在app→Http文件夹中的 kernel.php 中注册中间件

  • 在创建的中间件中编写逻辑

  • 将中间件分配给路由或控制器

Conclusion

Laravel中间件可以更轻松地保护我们的路由,过滤输入并完成许多其他工作,而无需编写如此多的逻辑。查看官方 Laravel 文档 这里 了解中间件的更多功能,最重要的是练习。

laravel $request 多维数组取值_大白话 Laravel 中间件相关推荐

  1. laravel $request 多维数组取值_Laravel 运行原理分析与源码分析,底层看这篇足矣

    精选文章内容 一.运行原理概述 laravel的入口文件 index.php 1.引入自动加载 autoload.php 2.创建应用实例,并同时完成了: 基本绑定($this.容器类Containe ...

  2. laravel $request 多维数组取值_3分钟短文:Laravel的“南天门”,过滤掉七七八八的数据...

    引言 上一章我们教会大家如何从用户表单内正确地获取数据,可是没有讲,获取到的数据到底有啥用,或者说,有的用户提交的数据压根儿就没正经填,那些错乱无效的数据,如果直接放到数据库,纯粹是对数据库的污染. ...

  3. laravel $request 多维数组取值_3分钟短文 | Laravel 内3种数据校验的写法,你喜欢哪一个?...

    引言 web应用程序公开访问几乎没有不带用户交互的,难免要接收用户输入的奇奇怪怪的东西.对于后端程序,必须对输入的内容进行有效性过滤. 这就是本文的重点,说一说laravel中输入请求的校验. 学习时 ...

  4. 一道简单的多维数组取值问题

    问题简述 给予一个多维数组和一个描述取值路径的一维数组, 通过调用函数f返回取值路径描述的值,如 f([[1, 2], [3, 4], [5, 6]], [0, 0]) -> 1 原问题传送门 ...

  5. php输出二维函数,兼容php二维数组取值函数array_column使用

    PHP5.5发布,其中增加了一个新的数组函数array_column,感觉不错的! 但是低版本PHP要使用,得自己实现: if(!function_exists('array_column')){ f ...

  6. 【C 语言】数组 ( 数组取值操作 | array[i][j] 用法 等价于 *( *(array = i) + j ) 用法 | 下标操作到指针操作演化过程 )

    文章目录 一.数组取值操作方法 二.一维数组取值 下标操作到指针操作 演化过程 三.二维数组取值 下标操作到指针操作 演化过程 一.数组取值操作方法 给定一个二维数组 : int array[2][3 ...

  7. c++如何定义二维数组结构体_原来数组还可以这么玩(宏把数组玩坏了)

    点击上方公众号名称关注,获得更多内容 ✎ 编 者 悟 语 想起青春追寻的昨天,你也是曾经追风的少年. 文 章 导 读 今天给小伙伴们介绍下用宏对数组值进行分类使用的方式,比较大的程序中的寄存器经常会这 ...

  8. php 数值相加_php递归遍历多维数组,合并值并相加

    php递归遍历多维数组,合并值并相加 作者:jao 发布于:2018-11-24 18:05 分类:PHP教程 弄了3个小时,一直在想如何合并多维数组,并且把值相加. 想到的是遍历数组,于是不断的百度 ...

  9. vue 取数组第一个值_vue遍历对象中的数组取值示例

    前几天小项目,没考虑周全,让后端改接口,改成数组中包含对象中包含数组的形式,后来越琢磨越不对,后台把所有数据放在了一个对象里,我拿弹窗数据不好拿,索性又改了回来,把后端折腾够呛,自己也折腾够呛,发上来 ...

最新文章

  1. 二者取其一(初遇)_网络流
  2. ue编辑器拖拽上传图片_为百度UE编辑器上传图片添加水印功能
  3. JAVA——声明包类的编译与运行解决方案
  4. 我的Git使用-资料查询,名博笔记
  5. Atitit.nosql api 标准化 以及nosql数据库的实现模型分类差异
  6. 手机用计算机怎么求最高分,计算机中求最高分怎么算【excel 如何去掉一个最高分和一个最低分求平均数】...
  7. 更改计算机时间出现没有权限,win7系统修改时间时显示没有权限的解决方法
  8. 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
  9. 如何优雅的实现一个九宫格抽奖
  10. java txt转pdf乱码,openoffice将txt文本转pdf中文乱码
  11. Revit API、AddInManager、RevitLookup、SDK的用途
  12. 计算机学校宣传片创意和构思,【差一步就会02】用PPT做影视宣传片
  13. 防火墙单向访问控制_使用防火墙实现安全的访问控制
  14. 简单的网页设计,以学校官网为例
  15. 英语词根记忆法(6)
  16. 死锁的定义和产生条件以及如何避免死锁
  17. 无需投资,小白在家也能闲鱼店创业赚钱,教你月入10000+丨国仁网络资讯
  18. idea插件开发(5)-Swing图形化设计
  19. Listener method could not be invoked with the incoming message消息队列RabbitMQ项目启动报错及监听队列报错
  20. can总线rollingcounter_汽车CAN总线详解

热门文章

  1. js input点击事件_Vue.js的旅程,简单的todo实例「602」
  2. c语言文件打开函数,C语言fopen函数中文件打开方式(参数值)
  3. mysql在linux下的安装_mysql在linux下的安装
  4. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
  5. 路由有类查找和无类查找方式
  6. 笨笨图片批量下载器 V0.3 beta[C# | WinForm | 正则表达式 | HttpWebRequest | Async异步编程] new...
  7. mysql 数据库引擎常识全集
  8. 为什么函数式编程很重要:不一样的白板图
  9. Http 请求处理流程(转)
  10. java多线程 生产者消费者_java多线程之生产者消费者经典问题 - 很不错的范例