1 回答
TA贡献1859条经验 获得超6个赞
这是 laravel 的预期行为,
Laravel 在通过管道运行请求之前首先收集所有特定于路由的中间件,并且在收集控制器中间件时创建控制器的实例,因此调用构造函数,但是此时请求尚未准备好。
你可以在这里找到泰勒背后的推理:
在构造函数中使用 session 或 auth 是非常糟糕的,因为尚未发生任何请求,并且 session 和 auth 本质上与 HTTP 请求相关联。您应该在实际的控制器方法中接收此请求,您可以使用多个不同的请求多次调用该方法。通过强制你的控制器在构造函数中解析会话或授权信息,你现在强制你的整个控制器忽略实际传入的请求,这可能会在测试等时导致严重问题。
因此,一种解决方案是创建一个新的中间件,然后将其应用于所有路由,就像这样,widgets
你的新中间件在哪里:
Route::group(['middleware' => ['auth', 'widgets']], function () {
// your routes
});
但是如果你真的想将它保留在构造函数中,你可以实现以下解决方法:
class YourController extends Controller
{
public function __construct(Request $request)
{
$this->middleware('auth');
$this->middleware(function ($request, $next) {
$widgets = Cache::get("widgets");
$usersdata = Cache::get("userdata");
$widgets = array_merge($widgets, $usersdata[$request->user()->id]["widgets"]);
View::share([
"widgets" => json_encode($widgets)
]);
return $next($request);
});
}
}
- 1 回答
- 0 关注
- 113 浏览
添加回答
举报