Laravel访问所有视图中的数据

时间:2016-12-21 16:06:27

标签: php laravel laravel-5.3

在我的所有观看中,默认情况下我已经能够访问{{Auth::user()->name}},我也尝试在我的观看中添加访问{{Profile::user()->...}}的功能,但我遇到了一些问题。我真的不想使用视图编辑器,如果我不需要this post suggests,因为看起来我需要手动列出每个视图。相反,我选择使用文档中列出的AppServiceProvider boot method。问题是我仍然无法呼叫{{ Profile::user()->title }}。我收到以下错误:

ErrorException in AppServiceProvider.php line 19:
Non-static method App\Profile::user() should not be called statically, assuming $this from incompatible context

这是我的AppServiceProvider.php

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use View;
use App\Profile;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
        View::share('user', Profile::user());
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

这是我的模型Profile.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Profile extends Model
{
    //
    protected $fillable = [
        'bio',
        'linkedin_url',
        'facebook_url',
        'twitter_username',
        'title',
        'profile_image',
        'user_id',
    ];
    public function user()
    {
        return $this->belongsTo('user');
    }
}

我做错了什么?如何在所有视图中访问用户个人资料数据?我可以看一个例子吗?

4 个答案:

答案 0 :(得分:2)

@Saumya和@martindilling都是正确的;您已绑定到您正在使用的服务提供商中的$user变量。您只需要使user()方法静态以按您希望的方式访问它:

public static function user(){
    if (auth()->user()) return auth()->user()->profile;
}

如果您使用它,那么如果您不想要它,则不需要View绑定。您可以在任何Blade模板中使用{{ Profile::user() }}。但这也有点愚蠢,因为现在你已经覆盖了你的关系方法名称。

如果您真的希望超级轻松访问当前用户的个人资料,为什么不制作一个可以从任何地方访问的帮助方法? currentUserProfile()还是什么?我不介意为每个项目保留一个带有一些快捷方法的文件,但是在向它添加内容时你必须有良好的纪律,否则你的代码将很快变得不可读。

我发现第二个答案here是一个非常明确的方法来添加自己的自定义辅助方法。

答案 1 :(得分:1)

根据您的代码,您静态地调用非静态方法。你不应该这样做。相反,您应该使用您想要特定用户的配置文件:

shell: cat /var/services/homes/admin/.ssh/id_rsa.pub | (ssh admin@host2 "cat >> ~/.ssh/authorized_keys")

您还可以获得所有具有此类&amp;的个人资料的用户你的模型应该是这样的:

View::share('user', Profile::find(1)->user);

或者,如果您想获取经过身份验证的用户的个人资料,您可以这样做:

class User extends Model {

    public function profile() {
        return $this->hasOne(Profile::class);
    }

}

class Profile extends Model {

    public function user() {
        return $this->belongsTo(User::class);
    }

}

View::share('user', User::with('profile')->get()); // <----- Get all users with profile

希望这有帮助!

答案 2 :(得分:1)

当您使用View::share('user', auth()->user); // <---- Gets the authenticated User View::share('user_profile', auth()->user()->profile); // <---- Gets the authenticated User's profile 时,您的个人资料用户将在视图中显示为View::share('user', Profile::user());:)

是的,你得到的错误信息是由于Saumya Rastogi写的原因,你需要让用户获得特定的个人资料:)

答案 3 :(得分:1)

您根本不需要共享此变量,因为您只想获取用户的配置文件(您始终加载用户数据)并且它是一对一的关系。只需添加适当的关系:

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

然后在应用中的任何位置使用它:

auth()->user()->profile->city

如果您要共享变量,您将向所有视图添加第二个查询,而在真实应用中,您绝对不希望这样做。