这是一个非常常见的任务。我试图在整个网站的导航上显示用户资料图片。个人资料图片是url从谷歌,facebook,或s3如果用户上传他们。我有这个函数来访问图片
public static function get_profile_pic($user){
$pic=array_flatten($user->media->where('category','profile'))[0]->path;
if(empty($pic)){
$pic = '/images/user-icon.jpg';
return $pic;
}else
return $pic;
}
在我的导航视图中我有:
@if(Auth::check())
<li><img class='nav-pic' src='<?php link_to_action('HomeController@index',$pic)?>'/></li>
我homecontroller :
类HomeController扩展控制器{
public function index(Request $request) {
if ($request->user()) {
$user = $request->user();
$pic = User::get_profile_pic($user);
}
view()->share('scripts', array('home.js'));
return view('home.index', compact('user'));
}
这是我在AppServiceProvider
中的内容public function boot()
{
if (Auth::check()){
$user = Auth::user();
$pic = User::get_profile_pic($user);
view()->composer('includes.new_nav1',function($view){
$view->with('pic', User::get_profile_pic($user));
});
}
}
当你看到类似User::method($user)
的代码时最好将其重构为方法在用户对象本身上,也就是$user->method()
Laravel有一个更好的东西叫做"追加"属性。这意味着它的行为与普通属性(数据库列)完全相同,您只需为它定义一个访问器方法:
1 -取你的函数:
public static function get_profile_pic($user)
并将其更改为
public function getProfilePicAttribute()
2 -用$this
代替$user
。
3 -最后,将这个数组添加到你的User模型中:
protected $appends = ['profile_pic'];
这告诉Laravel "profile_pic"表现得像一个数据库属性,但是应该而不是被保存到数据库表中。
现在对于任何User
对象,您可以简单地使用$user->profile_pic
,例如
<img src="{{ $user->profile_pic }}">
并将视图编写器更改为view->with($user, Auth::user())