laravel(七)-中间件(Middleware)

Middleware

HTTP中间件有什么用?

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

中间件使用流程

创建

在\app\Http\Middleware\文件夹下新建对应的中间件,例如Register.php.

<?php
namespace App\Http\Middleware;

use Closure;

class Register
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        /*** 前置操作 ***/
        // [前置操作],中间件逻辑操作先于路由真实对应的操作,中间件逻辑位于$next($request)前
        // 一些操作逻辑...
        return $next($request);

        /*** 后置操作 ***/
        // [后置操作],中间件逻辑操作后于路由真实对应的操作,中间件逻辑位于$next($request)后
        $response = $next($request);
        // 一些操作逻辑...
        return $response;
    }
}

注册

在\app\Http\Kernel.php中进行注册

<?php

namespace App\Http;

use App\Http\Middleware\Register;
use Illuminate\Foundation\Http\Kernel as HttpKernel;

class Kernel extends HttpKernel
{
    /**
     * The application's global HTTP middleware stack.
     * 在这里注册全局中间件
     *
     * @var array
     */
    protected $middleware = [
        \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
        \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,
    ];

    /**
     * The application's route middleware.
     * 在这里注册局部中间件
     *
     * @var array
     */
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'regester'=>Register::class,
    ];
}

使用

在路由中使用中间件,\app\Http\routes.php

Route::group(['middleware'=>'regester'],function(){
    Route::any('regester',[
        'as'=>'reg',
        'uses'=>'IndexController@regester'
    ]);
});

前置操作与后置操作

  • [前置操作]:中间件逻辑操作先于路由真实对应的操作,中间件逻辑位于\$next($request)前
  • [后置操作],中间件逻辑操作后于路由真实对应的操作,中间件逻辑位于\$next($request)后

发表评论