这是一项非常常见的任务。我正试图在整个网站的导航栏上显示用户个人资料图片。 个人资料图片是google,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扩展Controller {
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));
});
}
}
答案 0 :(得分:2)
每次看到类似User::method($user)
的内容时,最好重构一下,以便方法在用户对象本身上,即$user->method()
Laravel有更好的东西称为&#34;追加&#34;属性。这意味着它的行为与普通属性(数据库列)完全相同,您只需为其定义一个访问器方法:
1 - 接受你的职能:
public static function get_profile_pic($user)
并将其更改为
public function getProfilePicAttribute()
2 - 将$user
替换为该方法中的$this
。
3 - 最后,将此数组添加到您的用户模型中:
protected $appends = ['profile_pic'];
这告诉Laravel&#34; profile_pic&#34;行为类似于数据库属性,但不应保存到数据库表中。
现在,对于任何User
对象,您只需使用$user->profile_pic
,例如
<img src="{{ $user->profile_pic }}">
将视图编辑器更改为view->with($user, Auth::user())