【问题标题】:Problem with accessing global variable in Laravel application在 Laravel 应用程序中访问全局变量的问题
【发布时间】:2020-04-10 13:46:12
【问题描述】:

我正在尝试在 AppServiceProvider.php 中创建一个全局变量,我需要在所有刀片文件中贯穿我的整个应用程序含义。此变量是 $profile,它从用户那里获取配置文件数据并将它们显示在刀片​​中。我这样做了,所以当我在我的个人资料中时,它显示经过身份验证的用户是我,这很好(在 url 中就像这个个人资料/Authuser),Authuser 是来自数据库的用户名。问题是当我转到其他配置文件时,我收到错误未定义的用户名(在 url 配置文件/Someuser 中)。我需要帮助才能在 AppServiceProvider.php 中获取该用户名。问题在于服务提供商中的 $username。我不知道如何在全球范围内传递它。任何帮助表示赞赏。这是我的代码。

AppServiceProvider.php

public function boot()
{ 

    $profileId = $this->getIdFromUsername($username);  // Here is problem, I don't know how to get that username

    view()->composer('*', function ($view) {
        $view->with('profile', Auth::id() ? UserProfile::profileDetails($profileId, Auth::user()->id) : []);  
    });

    Builder::defaultStringLength(191); // Update defaultStringLength
}

public function getIdFromUsername($username)
{
    if ($user = User::where('username', $username)->first()) {
        return $user->id;  
    }

    return abort(404);  
}

web.php

Route::get('profile/{profile}', 'UserProfileController@showProfile')->name('profile.show');

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    我相信你把自己弄得太复杂了。

    如果我了解您的应用。用户的个人资料正确吗?

    转到您的用户模型并在用户和个人资料之间创建关系

    public function userProfile()
        {
            return $this->hasOne('App\UserProfile');
        }
    

    这样,个人资料将跟随用户,而您无需传递它。 如果您想要当前用户的个人资料。

    Auth::user()->userProfile();
    

    如果您想要其他用户的个人资料,那么

    $owner = User::where('username', $username)->first();
    $owner->userProfile();
    

    基本上,您只需找到您想要的用户,即可轻松访问已登录用户或任何其他用户的个人资料。

    现在,如果您真的希望在每个视图中都有一个模型,那么您将其放置在错误的位置。你看,服务提供者的目的是把事情联系起来,而不是获取数据。您可能正在考虑的是与服务提供者绑定的 View Composer,但实际数据来自 Composer 本身。您可以在文档中了解有关 View Composer 的更多信息。 https://laravel.com/docs/7.x/views#view-composers

    View Composers 只是其中的一种方式,快速的谷歌搜索提出了这个问题,它提供了 View Composer 的 3 个额外替代方案。 How to pass data to all views in Laravel 5?

    希望对您有所帮助。

    【讨论】:

    • 我什么都有。我唯一的问题是在哪里以及如何从 $owner = User::where('username', $username)->first(); 获取 $username 变量
    • 根据我的经验,当我刚接触 Laravel 时,我经常会想到无处不在的全局变量,比如购物车。我很快了解到,在大多数情况下,我可以通过与 Auth 用户的关系访问数据。这就是为什么我要你重新考虑你的方法。
    • 但是,直接回答您的问题。您无法从请求中获取 $username,因为这不是服务提供者的本意。在解析请求并且请求参数已知之前,请参阅任何服务提供者的 boot() 和 register() 方法,这就是您无法访问它们的原因。 laravel.com/docs/7.x/providersstackoverflow.com/questions/38764406/…
    • 是的,你是对的,我找到了适合我的解决方案。谢谢
    • 我扩展了答案,为您指出如何将模型传递给所有视图的选项。
    猜你喜欢
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多