Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 7用户数据在_构造中_Php_Laravel_Laravel 7 - Fatal编程技术网

Php Laravel 7用户数据在_构造中

Php Laravel 7用户数据在_构造中,php,laravel,laravel-7,Php,Laravel,Laravel 7,使用Laravel7。 在控制器构造器中,我希望能够访问当前的用户详细信息,以便将主站点小部件(按钮链接等)和自定义用户小部件加载到视图中显示的一个小部件中 use Illuminate\Support\Facades\Auth; ... $widgets = Cache::get("widgets"); $usersdata = Cache::get("userdata"); $this->middleware('auth'); $widgets =

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

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)
    ]);
然而,在研究的这一阶段,用户数据不可用(即使在认证之后?)。 不确定访问此文件的最佳方式,或者更好的做法可能是覆盖中间件身份验证(where?),以便它可以返回用户id或其他信息,例如:

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

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

这是laravel的预期行为,您可以阅读更多有关它的信息

Laravel在运行之前首先收集所有特定于路线的中间件 在收集控制器时,通过管道发送请求 中间件创建了控制器的实例,因此 构造函数被调用,但是此时请求还没有准备好 然而

你可以找到泰勒的推理:

在构造函数中使用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);
        });
    }
}

这回答了你的问题吗?