Laravel5.3使用学习笔记—中间件

Laravel5.3使用学习笔记—中间件

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
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113213.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • volatile禁止指令重排序_volatile int

    volatile禁止指令重排序_volatile intvolatile禁止指令重排JMM要求有序性计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致.(单线程不用关心指令重排)处理器在进行重新排序是必须要考虑指令之间的数据依赖性多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测源码写的顺序不见得和编译的指令顺序一样例子1比如源码如下publicvoidmySort(){intx

    2022年10月18日
    4
  • ftp文件上传及下载工具类[通俗易懂]

    ftp文件上传及下载工具类[通俗易懂]1、ftp文件上传用例解析(需使用apacher的commons-net-3.3.jar)publicclassTestFtp{@Testpublicvoidtest()throwsException{//1、创建FTP客户端FTPClientftpClient=newFTPClient();//2、

    2022年6月6日
    30
  • C++11关键字constexpr看这篇就够了

    C++11关键字constexpr看这篇就够了一 在普通函数中的使用例如下面的代码 数组的大小必须是常量 在声明数组 array 时 用函数返回值 此时会报错 errorC2131 表达式的计算结果不是常数 note 对未定义的函数或为未声明为 constexpr 的函数的调用导致了故障用 constexpr 关键字可以解决这种问题 在 GetLen 函数前加 constexpr 声明 代码如下 当然 constexpr 修饰的函数也有一定的限制 函数体尽量只包含一个 return 语句 多个可能会编译出错

    2025年8月6日
    3
  • 深挖P2P传输技术,升级与创新并举

    深挖P2P传输技术,升级与创新并举你用过P2P传输吗?现在的P2P传输可以说是继局域网、ftp、http之后最广泛使用的文件分享和传播途径,被众多企业运用在工作中。P2P传输,全称“点对点传输”,是一种文件即时传输方式,目标是让所有客户端都能提供资源,包括带宽、存储空间、计算能力。P2P传输技术有很多应用,包括共享各种格式音频、视频、数据等。**P2P传输技术是如何实现即时传输?为什么P2P传输可以被众多企业接受?**本文,我们将带着这两个问题出发,深挖P2P传输技术。一、一张图看懂P2P传输技术传统的http传输是服务器上直接复制

    2022年7月16日
    17
  • pycharm激活码2022(JetBrains全家桶)「建议收藏」

    (pycharm激活码2022)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlBI7JCUH1TG-eyJsa…

    2022年3月22日
    248
  • 用GVIM/VIM写Verilog——VIM配置分享「建议收藏」

    用GVIM/VIM写Verilog——VIM配置分享「建议收藏」使用VIM或GVIM最基本的配置,不包含任何插件相关的设置,VIM用于写verilog,非常欢迎大家在评论区分享讨论。本文不进行插件的配置,不进行基本使用方式与使用技巧的说明,仅作为基本配置的分享交流用GVIM/VIM写Verilog——VIM配置分享基本配置几点说明1,禁用方向键,使用jk代替ESC2,自动补全命令配置3,进行版权声明的设置4,一些其他映射基本配置setnocompatible”不兼容visyntaxon”语法高亮度显示setnoerrorbells”.

    2022年9月30日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号