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岁的男士访问';
    }]);
  • 相关阅读:
    IE浏览器和谷歌浏览器相互跳转
    centos7安装docker
    centos7安装groovy
    centos7安装NodeJs
    mongodb数据库的备份还原
    centos7最小版配置
    centos7中python2.7升级到python3.7
    typedef struct用法详解与小结
    MinGW的gdb调试
    MinGW-w64安装教程——著名C/C++编译器GCC的Windows版本
  • 原文地址:https://www.cnblogs.com/Alex-sk/p/6432940.html
Copyright © 2011-2022 走看看