在我的所有观看中,默认情况下我已经能够访问{{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');
}
}
我做错了什么?如何在所有视图中访问用户个人资料数据?我可以看一个例子吗?
答案 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
如果您要共享变量,您将向所有视图添加第二个查询,而在真实应用中,您绝对不希望这样做。