• Laravel之中间件


    一.中间件的作用

    HTTP 中间件提供了一个便利的机制来过滤进入应用的 HTTP 请求。例如,Laravel 包含了一个中间件来验证用户是否经过授权,如果用户没有经过授权,中间件会将用户重定向到登录页面,否则如果用户经过授权,中间件就
    会允许请求继续往前进入下一步操作。

    当然,除了认证之外,中间件还可以被用来处理更多其它任务。比如:CORS 中间件可以用于为离开站点的响应添加合适的头(跨域);日志中间件可以记录所有进入站点的请求。
    Laravel 框架内置了一些中间件,包括维护模式中间件、认证、CSRF 保护中间件等等。所有的中间件都位于app/Http/Middleware 目录。

    二.定义中间件

    1.命令

    php artisan make:middleware OldMiddleware
    

      

    这个命令会在app/Http/Middleware 目录下创建一个新的中间件类OldMiddleware,并且自动生成handle方法 ,在这个中间件中,我们只允许提供的 age 大于 200 的访问路由,否则,我们将用户重定向到主页:

    <?php
    namespace AppHttpMiddleware;
    use Closure;
    class OldMiddleware
    {
    	/**
    	* 返回请求过滤器
    	*
    	* @param IlluminateHttpRequest $request
    	* @param Closure $next
    	* @return mixed
    	*/
    	public function handle($request, Closure $next)
    	{
    		if ($request->input('age') <= 200) {
    			return redirect('home');
    		}
    		return $next($request);
    	}
    }  

    理解中间件的最好方式就是将中间件看做 HTTP 请求到达目标之前必须经过的“层”,每一层都会检查请求甚至会完全拒绝它

    2.中间件之前/之后

    a.请求前处理
    class BeforeMiddleware
    {
    	public function handle($request, Closure $next)
    	{
    		// 执行动作
    		return $next($request);
    	}
    }
    
    b.请求后处理
    class AfterMiddleware
    {
    	public function handle($request, Closure $next)
    	{
    		$response = $next($request);
    		// 执行动作
    		return $response;
    	}
    }
    

      

    三.使用中间件

    要想让中间件起作用,必须要注册中间件.

    1.全局注册
    如果你想要中间件在每一个 HTTP 请求期间被执行,,只需要将相应的中间件类放到app/Http/Kernel.php 的数组属性$middleware 中即可

    2.在路由和控制器中使用中间件(局部)
    a.首先应该在app/Http/Kernel.php 文件中分配给该中间件一个简写的 key,默认情况下,该类的$routeMiddleware 属性包含了 Laravel 内置的入口中间件,添加你自己的中间件只需要将其追加到后面并为其分配一个 key:

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

      

    b.在路由中使用

    Route::get('admin/profile', ['middleware' => 'test', function () {}]);

    或者

    Route::get('admin/profile', ['middleware' => 'test', 'IndexController@index']);

    c.在控制器中使用

    $this->middleware('auth');

    四.中间件参数

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

    <?php
    namespace AppHttpMiddleware;
    use Closure;
    class RoleMiddleware
    {
    	/**
    	* 运行请求过滤器
    	*
    	* @param IlluminateHttpRequest $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}', ['middleware' => 'role:editor', function ($id) {
    //
    }]);
    

      

    五.可终止的中间件

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

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

      

    terminate 方法将会接收请求和响应作为参数。一旦你定义了一个可终止的中间件,应该将其加入到 HTTP kernel 的全局中间件列表中。 当调用中间件上的terminate 方法时,Laravel 将会从服务容器中取出该中间件的新的实例,如果你想要在调用handle 和terminate 方法时使用同一个中间件实例,则需要使用容器的singleton 方法将该中间件注册到容器中。

  • 相关阅读:
    强化学习 | D3QN原理及代码实现
    Airtest入门及多设备管理总结
    JS图片base64压缩
    ABP框架
    .net gof23种设计模式
    VS2013添加Socket
    VS2013用InstallShield打包winfrom项目
    .net core3.1 log4net无法写日志
    git commit 修改提交说明信息
    screen 使用总结
  • 原文地址:https://www.cnblogs.com/itfenqing/p/6917637.html
Copyright © 2020-2023  润新知