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 關注
- 148 瀏覽
添加回答
舉報