为了账号安全,请及时绑定邮箱和手机立即绑定

__construct 中的 Laravel 7 用户数据

__construct 中的 Laravel 7 用户数据

PHP
狐的传说 2023-05-26 17:32:49
使用 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');我希望在构造函数中使用相同的方法,因此所有扩展该主控制器的控制器都可以使用相同的方法。
查看完整描述

1 回答

?
慕丝7291255

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);

        });

    }

}


查看完整回答
反对 回复 2023-05-26
  • 1 回答
  • 0 关注
  • 113 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信