在 Laravel 控制器构造函数中获取当前用户(或其他会话数据)

news/2024/10/24 10:27:45/

让我们讨论一些很多人无意中发现的事情:您不能直接在控制器的构造函数中使用会话数据。

此更改是在 Laravel 5.3 中引入的,当时重新连接了中间件管道以使全局范围与会话数据一起工作。

在这篇文章中,我们将更详细地研究这个问题,并研究解决它的各种方法

问题

人们想要在控制器的构造函数中获取会话数据的原因有很多。让我们看两个例子:

  1. 将当前用户共享给所有视图:

    与其auth()->user()在您的视图中使用,不如在所有视图中使用一个全局变量有时更好$user。实现这一目标的一种快速方法是向基本控制器添加一个构造函数并从那里共享它:

    public function __construct()
    {view()->share('user', auth()->user());
    }
  2. 在需要会话的控制器上设置属性:

    如果您在所有方法中都需要相同的信息,您可以选择将其设置为控制器上的属性:

    public function __construct()
    {$this->account = Account::find(session('account_id'));
    }

在这两种情况下,构造函数中的代码都假定会话已启动并准备就绪。但是如果我们尝试运行代码,它就会失败。此时,请求还没有被路由并且没有可用的会话数据。

解决方案#1:Authenticated事件

对于每个请求,Laravel 都会Authenticated在用户通过身份验证时触发事件。您可以在服务提供商中收听此事件,并$user从那里分享:

use Illuminate\Auth\Events\Authenticated;class AppServiceProvider extends ServiceProvider
{public function boot(){$this->app['events']->listen(Authenticated::class, function ($e) {view()->share('user', $e->user);});}
}

解决方案 #2:内联视图编辑器

如果您更愿意从基本控制器共享用户,则可以使用内联视图编辑器:

public function __construct()
{view()->composer('*', function ($view) {$view->with('user', auth()->user());});
}

由于回调只会在视图组合时执行,因此您可以访问会话。

解决方案 #3:将属性转换为方法

让我们回到问题部分的第二个例子。与其直接在构造函数中查找当前帐户,不如将其逻辑放入其自己的方法中,仅在实际需要时调用它:

public function index()
{$account = $this->account();// use it as before...
}protected function account()
{return Account::find(session('account_id'));
}

这对于新项目非常有用,但如果您已经有一个依赖于所有控制器方法都可用的属性的大项目,则可能会有点乏味。对于这种情况,您可以使用内联中间件。

解决方案#4:内联中间件

内联中间件比其他解决方案复杂一些,但可能是最灵活的。

您之前可能已经看到$this->middleware('auth'),它直接从控制器构造函数中注册现有的中间件。您可能不知道的是,您实际上可以使用闭包动态定义中间件。

使用内联中间件,我们可以挂钩请求的路由,以便我们可以完全访问会话:

public function __construct()
{$this->middleware(function ($request, $next) {$this->account = Account::find(session('account_id'));return $next($request);});
}

我们还可以使用内联中间件来共享$user所有视图:

public function __construct()
{$this->middleware(function ($request, $next) {view()->share('user', $request->user());return $next($request);});
}

如您所见,这比其他解决方案稍微复杂一些,但它为我们提供了最大的灵活性

 


http://www.ppmy.cn/news/69200.html

相关文章

CSP-202212-2 训练计划

目录 一、题目 二、思路 三、C代码如下 一、题目 问题背景 西西艾弗岛荒野求生大赛还有 n 天开幕! 问题描述 为了在大赛中取得好成绩,顿顿准备在 n 天时间内完成“短跑”、“高中物理”以及“核裂变技术”等总共 m 项科目的加强训练。其中第 i 项…

离散数学_九章:关系(3)

9.3 关系的表示 1、用集合表示关系2、用矩阵表示关系矩阵表示关系⭐集合上的关系矩阵 R 自反时 R 对称时 R 反对称时 ⭐确定关系合成的矩阵 3、用有向图表示关系有向图⭐从有向图中 确定关系具有的属性 自反性对称性反对称性传递性 本节及本章的剩余部分研究的所有关系均为二…

边缘网关协议(BGP)的演进与发展

边缘网关协议(Border Gateway Protocol,BGP)是一种用于在网络边缘传输路由信息的协议。它被广泛用于骨干网络和接入网络中,用于在网络边缘路由流量,并确保不同的网络之间具有最佳的路由路径。BGP是由RIP协议发展而来的,但在实现和…

Flink 常用API(2)——转换算子+聚合算子

转换算子(Transformation) 映射(map) 用于将数据流中的数据进行转换,形成新的数据流 “一一映射”,消费一个元素就产出一个元素 参数:接口 MapFunction 的实现 方法:map 返回值…

泼辣修图app下载2024最新版修图滤镜

泼辣修图专业版是一款强大的专业修图软件,拥有上百款调色工具还有丰富的图层素材, 更有智能的人像修饰面板,具备物体识别的智能蒙板,高效的滤镜管理系统和强大的文字工具,支持批量处理。一切围绕摄影,无论是…

【P1003 [NOIP2011 提高组] 铺地毯】

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n n n 张地毯,编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

1110 Complete Binary Tree(超详细注解+31行代码)

分数 25 全屏浏览题目 切换布局 作者 CHEN, Yue 单位 浙江大学 Given a tree, you are supposed to tell if it is a complete binary tree. Input Specification: Each input file contains one test case. For each case, the first line gives a positive integer N …

完美解决:由于找不到MSVR100.dll ,无法继续执行代码

当我们在运行某一个软件时,突然提示找不到MSVCR100.dll,我相信有不少用户都遇到过这种情况,并且在重新安装软件后还是无法解决。那么电脑提示找不到MSVCR100.dll该怎办呢? MSVCR100.dll是什么? 在解决找不到MSVCR100.dll这个问…