【发布时间】:2017-10-15 09:33:21
【问题描述】:
我在 laravel 5.3 中有一个系统,它使用了 40 多个控制器和可能有 200 个视图。
我正在尝试清理代码并使用最佳实践。鉴于某些调用几乎无处不在,因此将其定义为“半全局”的某个地方是有意义的。我假设这将在所有控制器扩展的Controller 中。
一个对象是$user,并且有子$user->organisations和$user->organisation->locations。
以基本控制器(或等效)方式加载它也会给我一个优势,即我可以确保以最佳方式急切加载子关系,确保任何foreach 样式代码永远不会导致多个小型数据库查找。还有许多其他的项目我想这样做,对数据库优化有类似的影响。这些都使用Auth::user(),它们会影响子对象的权限。
鉴于有大约 20 个要共享的属性/变量(全部依赖于 Auth::user()),从几乎所有方法中删除这些重复的代码是一个巨大的改进。
我的目标是能够从任何控制器引用$this->user,并且已经预加载了所有子/相关对象。
Laravel 5.3 重新组织了加载顺序,因此将登录的用户数据作为Controller::__construct 的一部分共享不再可行。
这是目前尝试的代码:
在Controller::__construct
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
view()->share('user', $this->user);
return $next($request);
});
不出所料,这在视图级别正确设置了$user 变量,但不是控制器级别。虽然我在视图级别执行 $user ,但这并没有帮助。
鉴于要共享大约 20 个使用属性/变量(全部依赖于 Auth::user()),我决定至少由一个 Helper 将其移动到一个集中位置。我将助手实例化为所有控制器的属性:$this->authentication_helper
在示例控制器中:SearchController:
public function index(Request $request): View
{
$this->authentication_helper->getAuthenticationData($this);
//... logic for the search
}
AuthenticationHelper 正在做(除其他外):
public function getAuthenticationData(Controller $controller) : void
{
$user = Auth::user();
$controller->user = User::with(
organisations.locations', // .. other children .. //
)->find($user->id);
// share to the view
View::share('user', $controller->user);
// ... other $controller property setting
return;
}
我不确定这是否是最佳做法。 edit - 先前提出的第二个问题已解决 - 主要问题仍然存在:
这种方法是否存在问题 - 将这 20 个左右的变量赋值移动到更高级别的等效方法是什么。
【问题讨论】:
-
您也可以在控制器和视图中直接使用全局变量
auth()->user()。因此,您不需要在 40 个控制器和更多方法中声明变量$user = Auth::user();。和$this->user->organisations可以替换为auth()->user()->organizations但是,它不会帮助急切加载。 -
不正确 - 该函数使用以下内容返回 null:
public function __construct() { $user = auth()->user(); var_dump($user); exit; } -
那么请求很可能不是来自经过身份验证的用户。
-
是的。我以管理员身份登录。我已通过身份验证。如果您在控制器方法中运行
Auth:user(),它会按预期工作,只是不在构造函数中(5.3+ laravel 更改并且按预期工作)。 -
如果
view()->share('user', $this->user);导致$user出现在您的视图中,这将导致我认为它正在工作。首先,我建议在$this->user = Auth::user();下方添加dd($this->user);,如果您确实获得了身份验证用户实例,那么我会检查您是否在设置后没有在其他地方更改$this->user。
标签: laravel authentication controller laravel-5.3