__construct 中的 Laravel 7 用户数据

使用 Laravel 7。在控制器构造函数中,我希望能够访问当前用户详细信息,以便我可以将主站点小部件(按钮链接等)和自定义用户小部件加载到一个中以显示在视图中


use Illuminate\Support\Facades\Auth;


...


    $widgets = Cache::get("widgets");

    $usersdata = Cache::get("userdata");

    $this->middleware('auth');

    $widgets = array_merge($widgets, $usersdata[Auth::user()->id]["widgets"]);

    View::share([

        "widgets" => json_encode($widgets)

    ]);

然而,在这个阶段,研究用户数据不可用(即使经过身份验证?)。不确定访问它的最佳方法,或者更好的做法可能是覆盖中间件身份验证(在哪里?),以便它可以返回用户 ID 或其他内容,例如:


$userid=$this->middleware('auth');

我希望在构造函数中使用相同的方法,因此所有扩展该主控制器的控制器都可以使用相同的方法。


狐的传说
浏览 114回答 1
1回答

慕丝7291255

这是 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);        });    }}
打开App,查看更多内容
随时随地看视频慕课网APP