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

How do I pass user profile pic in nav through AppServiceProvider? laravel-5

这是一个很常见的任务。我试图在整个站点的导航栏上显示用户个人资料图片。 个人资料图片是来自 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>

我的家庭控制器:

class 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 有一个更好的东西叫做 "appended" 属性。这意味着它的行为与普通属性(数据库列)完全一样,您只需为其定义一个访问器方法:


1 - 接受你的函数:

public static function get_profile_pic($user)

并将其更改为

public function getProfilePicAttribute()

2 - 在该方法中用 $this 替换 $user

3 - 最后,将此数组添加到您的用户模型中:

protected $appends = ['profile_pic'];

这告诉 Laravel "profile_pic" 的行为类似于数据库属性,但 不应该 保存到数据库 table.

现在对于任何 User 对象,您可以简单地使用 $user->profile_pic,例如

<img src="{{ $user->profile_pic }}">

并将您的视图编辑器更改为 view->with($user, Auth::user())