zoukankan      html  css  js  c++  java
  • 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');
        }
    
    }
  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/lxwphp/p/15454278.html
Copyright © 2011-2022 走看看