zoukankan      html  css  js  c++  java
  • Laravel5.1 中间件-middleware

    中间件的主要功能是在达到最终请求动作前对请求进行过滤和处理。

    中间件在Laravel中有着广泛的应用,比如用户认证、日志、维护模式、开启Session、从Session中获取错误信息,以及CSRF验证,等等。

    中间件的所在目录:appHttpMiddleware。里面有一些默认的middleware

    创建自己的middleware

    创建middleware非常简单,我们打开终端,cd到项目目录下执行以下命令即可:

    php artisan make:middleware TestMiddleware 

    这样 我们就可以在appHttpMiddleware下看见我们刚刚创建的middleware了。

    <?php
    
    namespace AppHttpMiddleware;
    
    use Closure;
    
    class TestMiddleware
    {
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // 在这里执行我们的逻辑
            return $next($request);
        }
    }

    实现一个简单的逻辑

    我们写一个小例子来瞧瞧,在TestMiddleware的handle方法中编辑:

        public function handle($request, Closure $next)
        {
            if ($request->input('age')<18){
                return redirect()->route('refuse');
            }
            return $next($request);
        }

    在路由中使用中间件,需要在appHttpKernel.php 文件中进行注册:

    <?php
    
    namespace AppHttp;
    
    use IlluminateFoundationHttpKernel as HttpKernel;
    
    class Kernel extends HttpKernel
    {
        /**
         * The application's global HTTP middleware stack.
         *
         * @var array
         */
        protected $middleware = [
            IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,
            AppHttpMiddlewareEncryptCookies::class,
            IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,
            IlluminateSessionMiddlewareStartSession::class,
            IlluminateViewMiddlewareShareErrorsFromSession::class,
            AppHttpMiddlewareVerifyCsrfToken::class,
        ];
    
        /**
         * The application's route middleware.
         *
         * @var array
         */
        protected $routeMiddleware = [
            'auth' => AppHttpMiddlewareAuthenticate::class,
            'auth.basic' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,
            'guest' => AppHttpMiddlewareRedirectIfAuthenticated::class,
            // 这是我们注册的middleware:
            'test' => AppHttpMiddlewareTestMiddleware::class,
        ];
    }

    注意:我们将testmiddleware注册到了 $routeMiddleware变量中,laravel的注释写的很清楚 如果我们要在全局都使用到这个middleware 就把他注册到$middleware变量中

    接下来我们就可以在路由中使用middleware了:

    Route::group(['prefix'=>'laravel', 'middleware'=>'test'], function (){
        Route::get('/write', function (){
            return 'Write laravel';
        });
        Route::get('/update', function (){
            return 'Update laravel';
        });
    });
    
    Route::get('/age/refuse',['as'=>'refuse', function(){
        return '您的年龄未满18岁';
    }]);

    我们在浏览器这样访问来测试:localhost:8000/laravel/write?age=15 或 localhost:8000/laravel/update?age=20

    在请求后执行动作

    有些时候,我们需要在请求后执行一些动作,可以这样写:

        public function handle($request, Closure $next)
        {
            $response = $next($request);
            // 执行一些动作
    
            return $response;
        }

    当然,必要的业务逻辑也有在请求前做认证,在请求后做一些动作的情况。

    带参数的Middleware

    除了请求实例$request和闭包$next之外,中间件还可以接收额外参数,我们还是以TestMiddleware为例,现在要求年龄在18岁以上的男性才能访问指定页面,handle方法定义如下:

        public function handle($request, Closure $next, $gender)
        {
            if ($request->input('age')>=18 && $gender==$request->input('gender')){
                return $next($request);
            }
            return redirect()->route('refuse');
        }

    对应的修改路由:

    // 使用:语法为middleware传入参数
    Route::group(['prefix'=>'laravel', 'middleware'=>'test:male'], function (){
        Route::get('/write', function (){
            return 'Write laravel';
        });
        Route::get('/update', function (){
            return 'Update laravel';
        });
    });
    
    Route::get('/age/refuse',['as'=>'refuse', function(){
        return '本站只允许满18岁的男士访问';
    }]);
  • 相关阅读:
    086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
    085 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 02 构造方法介绍 04 构造方法调用
    jQuery UI组件库Kendo UI使用技巧小分享
    Kendo UI ListView模板功能,让Web开发更轻松
    UI组件套包DevExpress ASP.NET Core v20.2新版亮点:全新的查询生成器
    Devexpress WinForms最新版开发.NET环境配置Visual Studo和SQL Server对应版本
    全新的桌面应用数据可视化呈现方式,Sankey Diagram控件你了解多少?
    java中的递归方法
    连接数据库查询 将查询结果写入exce文件中
    java连接mysql数据查询数据
  • 原文地址:https://www.cnblogs.com/Alex-sk/p/6432940.html
Copyright © 2011-2022 走看看