我如何通过AppServiceProvider在导航中传递用户配置文件pic ?laravel-5


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

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