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


    Laravel提供了中间件的使用。那什么是中间件呢,根据用法,我总结为,夹在“请求—>控制器—>响应—>end”中间运行的代码片段。本文将以官方英文文本为基础资料进行笔记记录。
    Laravel V5.3 middleware : https://laravel-china.org/docs/en/5.3/middleware


    一. 使用入门

    本人觉得常用的就是在”请求–>控制器”这个流程中插入中间执行代码。
    首先,需要创建中间件,如:

    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    use IlluminateSupportFacadesAuth;
    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' => AppHttpMiddlewareAuthenticate::class,
            'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
            'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
            'throttle' => IlluminateRoutingMiddlewareThrottleRequests::class,
            'test_mid' => AppHttpMiddlewareTest::class,  //在后面添加自己自定义的中间件
        ];

    最后,就是在路由的定义那里使用middleware方法进行绑定:

    Route::get('/', function () {
        return "hello <br/>";
    })->middleware('test_mid');

    配置完了,当在浏览器中输入如下网址时:

    http://Host/

    于是,就输出:

    this is middleware named test
    hello

    二. 结尾中间件(Terminable Middleware)

    在控制器前可以添加中间件,那么再控制器后也可以添加结尾中间件,使用相当简单,就是在自定义中间件里定义terminate函数,如下:
    (注意:以下用法中间件在控制器行为之后执行)

    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    use IlluminateSupportFacadesAuth;
    
    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 = [
            IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
            AppHttpMiddlewareTest::class,
        ];

    或者,希望一个路由能够同时使用多个中间件,就在app/Http/Kernel.php中的middlewareGroups数组添加自定义项,如:

    protected $middlewareGroups = [
            'testMG' => [
                AppHttpMiddlewareTest::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
  • 相关阅读:
    互动媒体学习社区-ASP.NET MVC 后台用户管理模块
    互动媒体学习社区-ASP.NET MVC 开发步骤
    互动媒体学习社区-ASP.NET MVC 数据库设计
    辗转相除法求最大公约数和最小公倍数分析
    C语言循环
    C语言中语句的跨行支持总结
    值得一学的C语言
    概率论
    Saul's Blog
    深入浅出 神经网络
  • 原文地址:https://www.cnblogs.com/lxwphp/p/9143976.html
Copyright © 2020-2023  润新知