【问题标题】:Laravel 5.5 global variable in template from service provider来自服务提供商的模板中的 Laravel 5.5 全局变量
【发布时间】:2018-05-21 13:48:45
【问题描述】:

如何在服务提供商中获取有关登录用户的信息?当我在我的模板 {{ $test }} 中使用它时,总是返回 0,但我 100% 确定我已登录。或者你有更好的解决方案?

use Illuminate\Support\ServiceProvider;
use Auth;
use View;

class AppServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $user = Auth::user();
        if ($user !== null) {
            $walletsCount = $user->wallets()->count();
        } else {
            $walletsCount = 0;
        }
        View::share('test', $walletsCount);
    }
}

【问题讨论】:

  • 但是你在做 Auth::user() 的时候已经有了用户
  • Auth::user() 已经是全球性的,因此我不太了解您的意图...
  • 当我在控制器中使用它时我没有任何问题。我想计算模板中的钱包数量。
  • 我仍然不明白这里的意图......这几乎就像你想要一个 ComposerServiceProvider。请澄清
  • 在会话中间件运行之前,您没有会话......服务提供者@boot 在生命周期的早期被调用,远在请求到达该中间件之前

标签: php laravel laravel-5 service-provider


【解决方案1】:

这是因为当 Laravel 加载服务提供者时身份验证功能尚未初始化。处理它的一种方法是将逻辑移动到视图:

{{ auth()->check() ? auth()->user()->wallets()->count() : 0 }}

另一种方法是使用带有闭包的视图编辑器:

public function boot()
{
    view()->composer('*', function($view) {
        $view->with('walletsCount', auth()->check() ? auth()->user()->wallets()->count() : 0);
    });
}

【讨论】:

    【解决方案2】:

    默认情况下,您无法在请求生命周期的早期访问会话。 web 中间件组有一个 StartSession 中间件负责实际启动和加载会话。默认情况下,Auth 系统 web 守卫使用会话来存储用户。所以你还没有访问会话的权限,所以用户将返回为null。该请求甚至还没有到达那个中间件堆栈。

    您可以添加一个中间件来执行此操作。将中间件添加到 web 堆栈的末尾。当此中间件运行时,堆栈中的前一个中间件已经加载了会话,因此您将可以访问那里的经过身份验证的用户。

    如果这就像一个布局,你需要这个变量,因为你可以使用视图编辑器。有一些选项完全取决于您的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2016-01-02
      • 2016-08-23
      • 1970-01-01
      • 2023-01-21
      • 2023-01-23
      • 1970-01-01
      相关资源
      最近更新 更多