如何通过AppServiceProvider在nav中传递用户个人资料照片? laravel-5

时间:2015-10-17 19:57:59

标签: php laravel laravel-5 blade service-provider

这是一项非常常见的任务。我正试图在整个网站的导航栏上显示用户个人资料图片。 个人资料图片是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));
        });
    }
}

1 个答案:

答案 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())