zoukankan      html  css  js  c++  java
  • laravel中间件-----------middleware

    middleware中间件

    是访问到达服务器后在被对应的路由处理之前所经过的一层过滤层,故称中间件。

    中间件是存放在apphttpmiddleware中,需要定一个 handle 处理方法,在handle中当处理完后,可以进行重定向,也可以使用 $next() 闭包函数执行之前的业务逻辑操作

    第一步 使用artisan生成中间件

    php artisan make:middleware testMiddleware

    生成apphttpmiddleware estMiddleware.php中间件

    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    
    class testMiddleware
    {
      中间件默认包含两个参数包含请求信息的$request和闭包函数$next
      $next可以继续执行之前的逻辑操作
      $request包含请求的信息
    public function handle($request, Closure $next) { // 处理请求      //执行业务操作 return $next($request); } }

    中间件可以加入其他参数

    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    
    class RoleMiddleware
    {
        public function handle($request, Closure $next, $parameter)
        {
        当age大于18时将参数写入文本
    if($request -> input('age') > 18) {   file_put_contents('testMiddlewareHandle.txt', $parameter);   }   return $next($request);   } }

    其他中间件参数需要使用 : 来分割  多个参数应当用逗号隔开

    Route::get('testMiddleware/{id}', ['middleware' => 'TestMiddleware:this is MiddlewareValue', 
    function($id){ file_put_contents('testRoute.txt', $id); }]); 当访问testMiddle时会经过中间件TestMiddlewarephp中的handle函数处理,函数中的$parameter被赋值
    'this is MiddlewareValue'

    除了middleware属性指定中间件,也可使用middleware链式指定中间件

    Route::get('/', ['middleware' => ['first', 'second'], function () {
        //
    }]);
    链式方法
    Route::get('/', function () { // }])->middleware(['first', 'second']);

    当访问http://localhost/testMiddleware/Route?age=19,public目录下会生成两个文件分别为testRoute.txt和testMiddlewareHandle.txt

    第二步 注册中间件

    设计好中间件后需要注册中间件,可以在 apphttpkernel.php 中注册全局的中间件$middleware

    protected $middleware = [
            IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
         ];

    也可以注册局部路由中间件

    protected $routeMiddleware = [
        'auth' => AppHttpMiddlewareAuthenticate::class,
        'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
        'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
        'test' => AppHttpMiddlewareTestMiddleware::class,
    ];

    中间件处理顺序及可终止中间件

    对于一个请求,需要中间件进行其他的操作对其处理,可以在操作之前或者之后进行处理

    可以在$next()之前或者之后进行处理业务逻辑也可以 redirect() -> route('route')进行重定向
    public
    function handle($request, Closure $next) { if (condition) { // 执行动作 } $response = $next($request); 请求处理 if (condition) { // 执行动作 } return $response; }

    可终止中间件

    可以终止中间件是在相应已经结束之后进行的操作,加上一个 terminate 方法,

    terminate方法含有两个参数:$request $response,  当使用可终止中间件需要将其注册进$middleware中

        protected $middleware = [
            IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
            AppHttpMiddlewareTestMiddleware::class,
        ];
    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    
    class RoleMiddleware
    {
        public function handle($request, Closure $next)
        {
                 ....
          return $next($request);
      }
    
        public function terminate($request, $response)
        {
            file_put_contents("resuest.txt", $request);
            file_put_contents("response.txt", $response);
        }
    
    }
    对于任何的请求都会执行terminat方法,也不要指定路由的中间层为 全局中间层 不然会报错 class not exist
  • 相关阅读:
    [GUIDE] How to Setup Ubuntu 16.04 LTS Xenial Xerus for Compiling Android ROMs
    设置Ubuntu 16.04 LTS的Unity启动器的位置命令
    sed系列:行或者模式匹配删除特定行
    HDOJ 4923 Room and Moor
    Office365client通过本地方式批量部署(即点即用部署)
    hdu 1867 A + B for you again
    Photoshop经常使用快捷键(2)
    SQL_为表和列加凝视
    从头认识java-17.5 堵塞队列(以生产者消费者模式为例)
    Unity5 怎样做资源管理和增量更新
  • 原文地址:https://www.cnblogs.com/yangxunwu1992/p/5399968.html
Copyright © 2011-2022 走看看