精华内容
下载资源
问答
  • laravel 初学中间件

    2019-04-29 11:03:51
    如果我们用if … else …这样子来处理的话,一旦需要判断的条件越来越多,会使得代码更加难以维护,系统间的耦合会增加,而中间件就是为了解决这类问题,应运而生的。 我们可以把这些判断逻辑,独立出来,开发成互不...

    什么是中间件
    对于一个Web应用来说,在一个请求真正被处理之前,我们可能会对请求进行各种各样的判断,然后才可以让它继续传递到后续的处理步骤中去。如果我们用if … else …这样子来处理的话,一旦需要判断的条件越来越多,会使得代码更加难以维护,系统间的耦合会增加,而中间件就是为了解决这类问题,应运而生的。

    我们可以把这些判断逻辑,独立出来,开发成互不相干的中间件,然后注册到系统中去,从而实现与if … else …同样的效果。如果使用过JavaWeb中的Filter,或者Spring中的AOP的同学,对Laravel中的中间件就不会感到太陌生。

    由于该系列文章的定位是“扫盲式”学习,以学会用为主,并不会过多的深入源码级别进行分析。下面就细说一下到底如何使用Laravel中的中间件。

    定义中间件
    在项目根目录下执行以下语句:

    php artisan make:middleware CheckRole
    

    这个命令会在app/Http/Middleware目录下创建一个CheckRole类。生成的代码如下所示:

    class CheckRole
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // 执行业务逻辑操作
            // ......
    
            return $next($request);
        }
    }
    

    现在我们就可以在handle函数中添加我们的处理逻辑。理解中间件的最好方式就是将中间件看做HTTP请求到达目标动作之前必须经过的“层”,每一层都会检查请求,并执行相关的业务逻辑操作。对于中间件的业务逻辑的执行顺序有以下两种:

    处理请求之前

    <?php
    namespace App\Http\Middleware;
    use Closure;
    
    class BeforeMiddleware
    {
        public function handle($request, Closure $next)
        {
            // 执行业务逻辑操作
            // ......
    
            return $next($request);
        }
    }
    

    处理请求之后

    <?php
    namespace App\Http\Middleware;
    use Closure;
    
    class AfterMiddleware
    {
        public function handle($request, Closure $next)
        {
            $response = $next($request);
    
            // 执行业务逻辑操作
            // ......
    
            return $response;
        }
    }
    

    定义完中间件以后,那中间件如何才能真正的应用到系统中呢?这个时候就需要说到中间件的注册,在Laravel中,我们可以将中间件注册为以下三种类型:

    全局中间件
    路由中间件
    中间件组

    下面就详细的说说如何注册中间件。

    注册全局中间件
    全局中间件指注册为全局的中间件会应用用于每一个HTTP请求。如果一个中间件在每次的HTTP请求时都要用到,那么就需要把它入到app/Http/Kernel.php文件里中的middlewaremiddleware数组中即可。在middleware数组中的中间件就称为全局中间件。

    注册路由中间件
    路由中间件指为路由而开发的中间件。使用在路由身上的中间件是在app/Http/Kernel.php的routeMiddleware使routeMiddleware数组属性中定义的。如果我们创建了一个新的给路由使用的中间件,就需要在它添加到routeMiddleware这个数组里,并给这个中间件一个key——相当于中间件的名字。例如:

    protected $routeMiddleware = [
        'admin.auth' => \App\Http\Middleware\AdminAuthenticate::class,
    '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,
    ];
    

    注册完路由中间件后,我们就可以将中间件应用我们定义的路由,例如这样:

    Route::get('admin/profile', function () {
        //
    })->middleware('auth');
    

    又比如这样:

    Route::middleware(['first', 'second'])->group(function () {
        Route::get('/', function () {
            // Uses first & second Middleware
        });
    
    Route::get('user/profile', function () {
        // Uses first & second Middleware
    });
    

    });
    注册中间件组
    中间件组中包含多个中间件,但它的使用和路由中间件是完全一样的。中间件组在app/Http/Kernel.php的$middlewareGroups属性中定义,每个中间件组还有一个对应的key。

    Laravel项目中,预设并使用了两个中间件组:web和api,它们分别用在了routes/web.php和routes/api.php上,前者是定义Web接口路由的地方,后者是定义API接口路由的地方。这两种类型的接口,各自都有一些通用的中间件,然后放在了一个组里进行管理。例如这样:

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    
    'api' => [
        'throttle:60,1',
        'bindings',
    ],
    

    ];
    使用中间件组带来一个好处——一次定义,即可使用多个中间件。

    注意,routes/web.php文件里的中间件已经默认使用了web中间件组,这是在RouteServiceProvider中定义的,在routes/web.php中定义路由时,是无需为路由额外分配web中间件组的。

    中间件参数
    中间件还可以接收额外的自定义参数,例如,如果应用需要在执行给定动作之前验证认证用户是否拥有指定的角色,可以创建一个CheckRole来接收角色名作为额外参数。

    额外的中间件参数会在$next参数之后传入中间件:

    <?php
    namespace App\Http\Middleware;
    use Closure;
    
    class CheckRole
    {
        /**
         * 运行请求过滤器
         *
         * @param \Illuminate\Http\Request $request
         * @param \Closure $next
         * @param string $role
         * @return mixed
         * translator http://laravelacademy.org
         */
        public function handle($request, Closure $next, $role)
        {
            if (! $request->user()->hasRole($role)) {
                // Redirect...
            }
            return $next($request);
        }
    }
    

    中间件参数可以在定义路由时通过:分隔中间件名和参数名来指定,多个中间件参数可以通过逗号分隔:

    Route::put('post/{id}', function ($id) {
        //
    })->middleware('role:editor');
    

    可终止的中间件
    有时候中间件可能需要在HTTP响应发送到浏览器之后做一些工作。比如,Laravel内置的“session”中间件会在响应发送到浏览器之后将Session数据写到存储器中,为了实现这个功能,需要定义一个可终止的中间件并添加terminate方法到这个中间件:

    <?php
    namespace Illuminate\Session\Middleware;
    use Closure;
    
    class StartSession
    {
        public function handle($request, Closure $next)
        {
            return $next($request);
        }
    
        public function terminate($request, $response)
        {
            // 存储session数据...
        }
    }
    

    terminate方法接受两个参数,请求实例和响应实例。定义好后,将这个中间件放在app/Http/Kernel.php,添加在中间件列表中即可。

    在调用terminate方法时,Laravel是从服务容器中找到并创建一个新的中间件实例使用的,如果你只要使用同一个中间件实例,那么就要使用容器的singleton方法注册中间件了。

    总结
    对于Laravle这系列的基础教程。很多内容我都是借鉴的网上其它网友的博文的,这类内容比较基础,总结来总结去就那么多东西,也讲不出花来。我更多的是将网上这类型的文章进行组装,再进行思路梳理,以一篇更适合入门的新手阅读的文章而奉献给大家。

    展开全文
  • laravel - 中间件使用

    千次阅读 2016-09-22 15:07:41
    1、中件间保存目录:app/Http/Middleware 2、自定义中间件: (1) php  artisan make:middleware [NameMiddleware] // 生成中件间类模板 ... // 参数一是请求,参数二是下一个中间件,可增加其它所需参数到参数

    1、中件间保存目录:app/Http/Middleware


    2、自定义中间件:

    (1)  php  artisan  make:middleware  [NameMiddleware]// 生成中件间类模板

    (2) 在app/Http/Middleware在打开创建的中件间类,在handle方法实现自己的逻辑。// 参数一是请求,参数二是下一个中间件,可增加其它所需参数到参数二后。

    (3) 将自己的处理逻辑写在 return $next($request) 之后,表示该中间件在请求之后执行,反之则在请求之后执行。

    (4) 注册中间件(使生效):在文件 App\Http\Kernel.php 的routeMiddleware数组中,加入自己的中件间键值。

    (5) 在路由中第二个参数指定要用到的中间件,['middleware'=>'中间件1 : 参数, 中间件二...']

    展开全文
  • Laravel 中允许跨域请求,我们可以在app/Http/Middleware/文件夹下构建一个追加响应的中间件Cors.php,用来添加专门处理跨域的请求的响应头: namespace App\Http\Middleware; use Closure; use Response; ...

    原文地址:

    跨域的请求

    出于安全性的原因,浏览器会限制 Script 中的跨域请求。由于 XMLHttpRequest 遵循同源策略,所有使用 XMLHttpRequest 构造 HTTP 请求的应用只能访问自己的域名,如果需要构造跨域的请求,那么开发者需要配合浏览器做出一些允许跨域的配置。

    W3C 应用工作组推荐了一种跨资源共享的机制,这种机制让 Web 应用服务器能支持跨站访问控制,从而使得安全的进行跨站数据传输成为可能,该机制通过几种方式来对原有模式进行了扩展:

    • 响应的头部应该追加 Access-Control-Allow-Orign,用来表明哪些请求源被允许访问资源内容
    • 浏览器会对请求源和响应中的值进行匹配验证
    • 对于跨域的请求,浏览器会预发送一个非简单方式的请求,来判断给定资源是否准备接受跨域资源访问
    • 服务端应用通过检查请求头部的 Orign 来判定请求是否跨域。

    跨源资源共享标准

    跨源资源共享标准通过新增一系列 HTTP 头,让服务器能声明哪些来源可以通过浏览器访问该服务器上的资源。另外,对哪些会对服务器数据造成破坏性响应的 HTTP 请求方法(特别是 GET 以外的 HTTP 方法,或者搭配某些 MIME 类型的 POST 请求),标准强烈要求浏览器必须先以 OPTIONS 请求方式发送一个预请求(preflight request),从而获取知服务器端对跨源请求所支持 HTTP 方法。在确认服务器允许跨源请求的情况下,以实际的 HTTP 请求方法发送那个真正的请求。服务器端也可以通知客户端,是不是需要随同请求一起发送信用信息(包括 Cookies 和 HTTP 认证相关数据)。

    跨源共享标准需要浏览器和服务端共同配合才能完成,目前浏览器厂商已经可以将请求部分自动完成,所以跨源资源访问的重点还是在于服务器端。

    下面列出一些标准中可用的响应头和请求头。

    Response Header

    • Access-Control-Allow-Origin : 指明哪些请求源被允许访问资源,值可以为 "*","null",或者单个源地址。
    • Access-Control-Allow-Credentials : 指明当请求中省略 creadentials 标识时响应是否暴露。对于预请求来说,它表明实际的请求中可以包含用户凭证。
    • Access-Control-Expose-Headers : 指明哪些头信息可以安全的暴露给 CORS API 规范的 API。
    • Access-Control-Max-Age : 指明预请求可以在预请求缓存中存放多久。
    • Access-Control-Allow-Methods : 对于预请求来说,哪些请求方式可以用于实际的请求。
    • Access-Control-Allow-Headers : 对于预请求来说,指明了哪些头信息可以用于实际的请求中。
    • Origin : 指明预请求或者跨域请求的来源。
    • Access-Control-Request-Method : 对于预请求来说,指明哪些预请求中的请求方式可以被用在实际的请求中。
    • Access-Control-Request-Headers : 指明预请求中的哪些头信息可以用于实际的请求中。

    Request Header

    • Origin : 表明发送请求或预请求的来源。
    • Access-Control-Request-Method : 在发送预请求时带该请求头,表明实际的请求将使用的请求方式。
    • Access-Control-Request-Headers : 在发送预请求时带有该请求头,表明实际的请求将携带的请求头。

    中间件

    在 Laravel 中允许跨域请求,我们可以在app/Http/Middleware/文件夹下构建一个追加响应的中间件Cors.php,用来添加专门处理跨域的请求的响应头:

    <?php
    namespace App\Http\Middleware;
    
    use Closure;
    use Response;
    class Cors {
    
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $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, Accept');
            $response->header('Access-Control-Allow-Methods', 'GET, POST, PATCH, PUT, OPTIONS');
            $response->header('Access-Control-Allow-Credentials', 'false');
            return $response;
        }
    
    }
    

    使用中间件

    在app/Http/Kernel.php文件中protected $routeMiddleware处增加'cors' => \App\Http\Middleware\Cors::class,。

    kernel文件

    需要跨域请求的路由:

    Route::group(['middleware'=>'cors'], function() {
        Route::any('/send','SendController@index');
    });

    其中有以下需要注意的地方:

    • 对于跨域访问并需要伴随认证信息的请求,需要在 XMLHttpRequest 实例中指定 withCredentials 为 true。
    • 这个中间件你可以根据自己的需求进行构建,如果需要在请求中伴随认证信息(包含 cookie,session)那么你就需要指定 Access-Control-Allow-Credentials 为 true, 因为对于预请求来说如果你未指定该响应头,那么浏览器会直接忽略该响应。
    • 在响应中指定 Access-Control-Allow-Credentials 为 true 时,Access-Control-Allow-Origin 不能指定为 *
    • 后置中间件只有在正常响应时才会被追加响应头,而如果出现异常,这时响应是不会经过中间件的。

    转载于:https://www.cnblogs.com/phpk/p/10923128.html

    展开全文
  • laravel5.3 中间件与构造函数的详解

    千次阅读 2019-01-22 09:35:58
    经过一系列测试,最终发现,是构造函数和中间件的...而如果我们用if else这样子来,一旦需要判断的条件越来越来,会使得代码更加难以维护,系统间的耦合会增加,而中间件就可以解决这个问题。我们可以把这些判断独立...

    经过一系列测试,最终发现,是构造函数和中间件的执行顺序有问题:

    1.先执行构造函数

    2.再调用中间件

    什么是中间件?

    对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才可以让它继续传递到更深层次中。而如果我们用if else这样子来,一旦需要判断的条件越来越来,会使得代码更加难以维护,系统间的耦合会增加,而中间件就可以解决这个问题。我们可以把这些判断独立出来做成中间件,可以很方便的过滤请求。

    中间件代码分析

    中间件可以实现啊很多功能,例如权限验证,访问记录,重定向等等。

    具体干什么看自己想法。

    中间件在请求阶段会调用自己的handle()方法
    同时中间件也可以在响应阶段使用,这时,会掉用它的terminate()方法。
    所以,当需要在响应发出后使用中间件只需要重写terminate()方法即可。

    <?php
    
    namespace App\Http\Middleware;
    
    use Closure;
    
    class TestMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            return $next($request);
        }
        public function terminate($request, $response)
        {
            //这里是响应后调用的方法
        }
    }

    handle()方法

    handle()方法有两个参数
    $request --->请求信息,里面包含了输入,URL,上传文件等等信息。
    $next --->闭包函数。我的理解是将接下来需要执行的逻辑装载到了其中。

    返回值:
    通过上文对参数的描述可以了解到:
    当我们在中间件中return $next($request);时,相当与把请求传入接下来的逻辑中。
    同时,中间件也可以返回重定向,不运行之前的逻辑。
    例如,希望将页面重定向到'/welcome'的页面return redirect('welcome').
    注意,这里是重定向到"/welcome"这个地址的route而不是"welcome"这个页面(view)。

    terminate()方法

    参数
    $request --->请求信息,里面包含了输入,URL,上传文件等等信息。
    $response -->响应消息,包含了逻辑处理完成后传出到的响应消息。

    因为terminate()方法只是在响应后进行一些处理所以没有返回值。

    我在项目中创建了一个中间件,然后发现中间件在控制器构造方法执行完后才调用了,然后重新建了个项目试了下。

    class Test
    {
    
        public function handle($request, Closure $next)
        {
            dump('a');
            return $next($request);
        }
    }   

    控制器

    class TestController extends Controller
    {
      public function __construct()
      {
        dump('b');
      }
    
      public function index()
      {
        dump('c');
      }
    }

    最终呈现结果 

    展开全文
  • 而如果我们用if else这样子来,一旦需要判断的条件越来越来,会使得代码更加难以维护,系统间的耦合会增加,而中间件就可以解决这个问题。我们可以把这些判断独立出来做成中间件,可以很方便的过滤请求。 #2 Laravel...
  • Laravel中间件实现原理

    千次阅读 2017-02-21 15:40:28
    1. 什么是中间件?对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才可以让它继续传递到更深层次中。...2. Laravel中的中间件Laravel中,中间件的实现其实是依
  • laravel 中间件的使用

    2016-12-14 16:31:59
    1、中件间保存目录:app/Http/Middleware2、自定义中间件:(1) php artisan make:middleware [NameMiddleware]// 生成中件间类模板(2)在...//参数一是请求,参数二是下一个中间件,可增加其它所需参数到参数二后。...
  • Laravel 三种中间件作用讲解

    千次阅读 2018-09-16 12:28:39
    昨天在开发过程中,需要使用到中间件的技术,之前都只是简单的认为要增加中间件就往middleware里添加中间件即可。本着周末的时间,就仔细研究了下 $middleware $middlewareGroup $routeMiddleware三个属性,到底是...
  • 但对于手机客户端,可能并不会支持原始的 Cookie,亦或者根据平台需要而屏蔽,因此开发中要求通过增加一个请求头 X-Session-Token 来标识 SessionID。在 Laravel 框架中,实现 Session 初始化、读取和启动,都
  • 在/app/http/Middleware/中添加日志中间件UserRequestAndResponseLog.php <?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\JsonResponse; use Illuminate\Support\Facades\Storage; ...
  • 希望在我的每个页面进行cookie的种植,方便他们进行定位分析,我思考了一下,简单呀,首先考虑的是通过中间件进行cookie种植,但是随后发现在现在的项目结构里贸然增加一个单纯的非通用性的中间件,会导致项目的耦合...
  • 给应用增加请求日志和响应日志是一个很不错的习惯,为日后的问题排查非常有用,尤其是那些不好复现的问题 我们可以通过请求参数和响应数据来分析了。 添加两个中间件 app\Http\Middleware\RequestLog.php <?php /...
  • laravel使用jwt和refreshToken中间件

    千次阅读 2018-10-18 16:45:33
    项目根目录命令行执行 1. 使用 composer 安装 ...# 这条命令会在 config 下增加一个 jwt.php 的配置文件 php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServic...
  • <div><p>因为现在 5.2 的路由新增了 web 中间件,而此包内置的routes文件并没有启用 web 中间件,导致相关的 session 组件也没有启动,也就是说无法通过 session 存储,只有无会话方式才能...
  • laravel中间件使用了装饰者模式。比如,验证维护模式,cookie加密,开启会话等等。这些处理有些在响应前,有些在响应之后,使用装饰者模式动态减少或增加功能,使得框架可扩展性大大增强。 接下来简单举个例子,...
  • laravel集成使用消息中间件rabbitmq,提供服务器异步消息处理,提升服务器性能。下面谈谈如何安装及集成使用。 安装 代码集成 .env文件 ... #laravel默认连接为sync,改为rabbitmq QUEUE_CONNECTION=...
  • laravel中间件使用了装饰者模式。比如,验证维护模式,cookie加密,开启会话等等。这些处理有些在响应前,有些在响应之后,使用装饰者模式动态减少或增加功能,使得框架可扩展性大大增强。接下来简单举个例子,...
  • laravel-API解决跨域问题创建中间件注册路由,增加中间件 Access to XMLHttpRequest at '...
  • 定义了一个命名空间和一个中间件: <pre><code> php protected function mapWebRoutes() { Route::middleware('web') ->namespace($this->namespace) ->group(base_path('routes/web....
  • 定义了一个命名空间和一个中间件: <pre><code> php protected function mapWebRoutes(Router $router) { $router->group([ 'namespace' => $this->namespace, 'middleware' &...
  • Laravel5多应用修改

    2017-11-08 21:09:00
    laravel5与laravel4在应用层上有很大的变化,主要变化有app目录结构,支持中间件等。 laraval5 多应用修改只需要改变自动加载即可。为了可复制性,可以定义一个应用名常量,后续增加应用可直接复制public和apps目录...
  • 上一篇文章实现了记录用户访问,设计上是有缺陷的,代码紧耦合在中间件。如果后续修改需求,不仅记录 ip、城市,还需要记录数据到新的数据表,或者需要进行其它统计,那么不停的增加、修改代码是不合理的。这个时候...
  • Laravel Api 报错 Too Many Attempts

    千次阅读 2020-09-14 17:12:48
    这是因为Laravel从5.2开始,增加了一个Throttle的中间件。在app/Http/Kernel.php文件,你就会发现,api路由是默认使用了这个中间件的。 这个中间件的作用是限制同一个Ip访问同一个Api的访问次数,模式是1分钟内只能...
  • 假设增加一个game的路由, 1.在router里增加game.php 2.在RouteServiceProvider中增加映射 3.在Middleware中增加game.php中间件,可直接复制apo.php 4.在Kernel.php中注册中间件。 大功告成。 只是列出了步骤。 ...
  • 使用框架中的中间件

    2020-10-29 14:34:22
    1:laravel中的中间件 2:在登录时定义的加密方式 ,可以设置一个中间件 进行登录时对接口的解密。此时需要注意的是 在kernel文件中 要声明一下中间件的名称 。 3:在对应的接口路由中 增加 中间件 验证 (中间件...
  • Laravel中为我们提供了一种简单的方式来处理用户授权动作,主要有两种方式Gates和Policy(策略),但这两种方法默认是认证User模型的信息,我们想使授权认证为后台用户Admin模型的信息需进行如下操作 1.参照我的另一...

空空如也

空空如也

1 2 3
收藏数 41
精华内容 16
关键字:

laravel增加中间件