我花了一整天的时间试图找到最佳实践解决方案。在让用户查看任何其他页面之前,我想检查用户表中的布尔字段是否为true。
我使用的是内置于auth的Laravels,我已经尝试了许多已经存在堆栈溢出的解决方案,但它们都不起作用。
创建一个中间件。类似的东西:
<?php
namespace App'Http'Middleware;
use Closure;
use Auth;
use Redirect;
class UserHasField
{
/**
* Handle an incoming request.
*
* @param 'Illuminate'Http'Request $request
* @param 'Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (Auth::user()->field === 0)
return redirect()->route('named.route');
return $next($request);
}
}
现在将您的中间件类添加到kernel.php
(在http中)文件夹:
protected $routeMiddleware = [
...
'user_has' => 'App'Http'Middleware'UserHasField::class,
];
现在在你的路线中使用它,例如:
Route::group(['middleware' => ['user_has']], function () {
...
});
Oliver Queen拥有Laravel 5.0的正确/最佳实践和目的。
中间件的概念(正如Jeffrey Way所说)就像一个洋葱。它的目的是"在你到达控制器之前"你想做什么。Auth本身就像验证一样是一个中间件服务。
您所需要做的就是构造额外的中间件逻辑代码,以提取对该字段的额外检查,并接受/拒绝(如果存在)。
现在您已经声明"我必须针对所有控制器进行编码?"不,这就是中间件的美妙之处,您可以将它们作为一个组的一部分使用。
查看Matt Stauffer的解释:https://mattstauffer.co/blog/middleware-groups-in-laravel-5-2