Laravel 5.2或5.3中的中间件有什么用?

时间:2016-12-17 14:31:47

标签: laravel-5.2

我是初学者,我不清楚Laravel中的中间件概念。请帮我用一个例子来清除这个概念。

1 个答案:

答案 0 :(得分:3)

中间件是放在两个请求之间的东西。

假设您需要确保当用户访问特定路由组时,他/她已经过身份验证。

有两种选择:

  1. 在每个控制器中添加代码以检查用户是否已登录(在此示例中我们不考虑父控制器)
  2. 使用中间件
  3. 在第一种情况下,您应该在每个控制器中写入相同的代码。

    使用中间件,您可以在应用程序的多个部分中重复使用一段代码。

    假设我们想创建一个需要检查用户是否已登录的中间件:

    namespace App\Http\Middleware;
    
    use Closure;
    
    class UserIsLoggedIn
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            if (!auth()->user()) {
                return redirect('home');
            }
    
            return $next($request);
        }
    
    }
    

    现在使用此代码,我们可以检查用户所需的位置 首先,因为这是一个自定义中间件,您需要在$ app/Http/Kernel.php属性的routeMiddleware文件中注册它:

    protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        // ...
        'isLoggedIn => \App\Http\Middleware\UserIsLoggedIn::class,
    ];
    

    假设您有一组需要检查用户登录的路由:

    Route::get('admin/profile', function () {
        //
    })->middleware('isLoggedIn');
    

    现在该组中的所有路由都将检查用户是否已登录,否则他将重定向到家。

    现在假设您有另一个需要确保用户已登录的控制器,现在您可以重新使用中间件来执行此操作:

    class MyController extend Controller {
        function __construct(){
            $this->middleware('isLoggedIn');
        }
    }
    

    因此,中间件可以帮助您组织登录并重复使用特定任务的代码片段。

    Laravel有很多关于中间件的文档,你可以find here