在Laravel中使用检查年龄中间件

时间:2017-12-03 18:59:56

标签: php laravel

我正在学习laravel,现在我陷入了中间件的困境。我有上课AdultMiddleware.php:

<?php
namespace App\Http\Middleware;

use Closure;

class AdultMiddleware
{

  /**
  * Handle an incoming request.
  *
  * @param \Illuminate\Http\Request $request
  * @param \Closure $next
  * @return mixed
  */
  public function handle($request, Closure $next)
  {
    if (Session::get('age') < 18) {
      return view('search');
    }

    return $next($request);
    }
}

它是Kernel.php中的简称:

    protected $routeMiddleware = [
        'adult' => \App\Http\Middleware\AdultMiddleware::class,
];

在web.php中:

Route::get('middle', array('as' => 'middle', 'age' => '16', 'before' => 'adult', function()
{
    return view('welcome');
}));

正如您在路线中看到的那样,我将年龄定为16,但仍然会返回欢迎而不是搜索。我做错了什么?我知道这可能听起来像新手,但我确实尝试谷歌,没有运气。这就是我在这里问的原因。

1 个答案:

答案 0 :(得分:2)

将中间件分配给路线:

Route::get(..., ['middleware' => 'adult', ...]);

Route::get(..., ...)->middleware('adult');

before适用于Laravel中不再存在的过滤器,因为中间件替换了过滤器。

Route::get('middle', ['as' => 'middle', 'middleware' => 'adult', function () {
    return view('welcome');
}]);

Laravel Docs - 5.2 - Middleware - Assigning Middleware to routes

Laravel Docs - 5.5 - Middleware - Assigning Middleware to routes

如果您的中间件要检查会话变量,您可以添加路由以便能够根据需要设置该会话变量。

Route::get('set/age/{age}', function ($age) {
    session(['age' => $age]);

    return redirect()->route('middle');
});

这会在会话中设置age变量,并将您重定向到“中间”路线。

此外,您可能希望将重定向返回到搜索页面,而不是从中间件返回视图。