zoukankan      html  css  js  c++  java
  • Laravel入坑指南(7)——中间件Middleware

    Laravel框架中引入了“中间件”这个概念,笔者觉得不是太合适。这里的Middleware和Java Servlet中的过滤器(Filter)就是一个东西,但是想比之下Filter这个词更容易理解一些。当然,为了入乡随俗,我们在这里也称这东西为“中间件”。

    中间件的作用其实很简单,很明了:在业务行为之前先做点事情(前中间件)-->执行业务行为-->再做点其它事件(后中间件)。让我们来张灵魂画图:

    所以,我们现在需要解决下面两个问题:创建和配置。

    1、中间件的创建

    在项目根目录下,执行php artisan make:middleware TestMidWare,就可以在/app/Http/Middleware下就自动生成了一个TestMidWare.php文件,里面有个TestMidWare类,原始代码如下:

    2、中间件的使用

    既然现在中间件类已经创建出来了,我们就开始讨论怎么让这个类生效。注册中间件,让中间件起作用,我们在这里讨论两种很常见的方式:全局中间件 和 路由中间件。

    无论是哪一种中间件,都要在/app/Http/Kernel.php中注册,才可以生效。

    (1) 全局中间件

     Kernel.php文件中有一个名为$middleware的数组,只要将我们的中间件类(例上上面的TestMidWare)写在这个数组中,就会对所有的业务流程生效,如下图:

     (2)路由中间件

    在Kernel.php文件中有一个名为$routeMiddleware的数组,将中间件类写在这个数组中(要以key=>value的形式),并且在路由中指定,就可以生效,如下图:

     接着,我们在路由中指定这个中间件:

    这时当我们访问http://域名/hello/id的时候,在MyController@hello的业务生效前后,CrossDomain中间件就会起作用。 

    3、前/后中间件

    无论是前中间件还是后中间件,本质都是中间件,创建和注册的方法都完全一样。只是代码在中间件类里的位置不一样而已。一个中间件可以同时是前中间件和后中间件。代码如下所示:

    namespace AppHttpMiddleware;
    
    use Closure;
    
    class TestMidWare
    {
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            //A    前中间件代码
            $response=$next($request);    //业务流程,流转到下一个中间件,或者业务处理函数
            //B    后中间件代码
            
            return $response;
        }
    }

    代码写在A部分,这个中间件就是前中间件;代码写在B部分,这个中间件就是后中间件;如果A和B两个部分都写,那么这个中间件既是前中间件,也是后中间件。

    4、其他

    到了这里,中间件的使用方法就告一段落了。下面举个中间件使用的例子,我的代码需要实现跨域,所有的API响应之前都要输出跨域的header,所以我选用了中间件来处理:

    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    
    class CrossDomain
    {
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            $response=$next($request);
    
            $response->header('Access-Control-Allow-Origin', "*");
            $response->header('Access-Control-Allow-Headers', 'Origin, Content-Type, Cookie, X-CSRF-TOKEN, Accept, Authorization, X-XSRF-TOKEN');
            $response->header('Access-Control-Expose-Headers', 'Authorization, authenticated');
            $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
            $response->header('Access-Control-Allow-Credentials', 'true');
    
            return $response;
        }
    }

    中间件的话题到这里结束,上面是最最常用的中间件知识点。当然,中间件还有其他的话题:中间件组、终端中间件、中间件参数,这些大家就参考官方手册吧。

    下回见咯:)

    ---------------------------  我是可爱的分割线  ----------------------------

    最后博主借地宣传一下,漳州编程小组招新了,这是一个面向漳州青少年信息学/软件设计的学习小组,有意向的同学点击链接,联系我吧。

  • 相关阅读:
    计算机基础知识
    markdown简介及基本语法
    session和cookie的区别
    MySQL的游标
    数据库单表查询
    外键(有无级联)
    mysql
    数据库引擎
    守护进程和守护线程的区别
    快排等
  • 原文地址:https://www.cnblogs.com/ddcoder/p/13367279.html
Copyright © 2011-2022 走看看