Laravel 5.4+: мутатор / аксессор для загруженного изображения

Я пытаюсь использовать мутатор для хранения и извлечения пользователей gravatar.

В моей модели пользователя у меня есть:

public function getGravatarAttribute($gravatar){
if($gravatar){
$image = Storage::disk('local')->get('public/avatars/'.$gravatar.'.jpg');
return new Response($image, 200);
}

$hash = md5(strtolower(trim($this->attributes['email'])));
return "http://www.gravatar.com/avatar/$hash?s=256";
}public function setGravatarAttribute($gravatar){
if(is_object($gravatar) && $gravatar->isValid()){
$image = Image::make($gravatar)->fit(256, 256);
Storage::disk('local')->put('public/avatars/'.$this->id . '.' . $gravatar->getClientOriginalExtension(),  $image->response());
$this->attributes['gravatar'] = $this->id;
}
}

В файле Blade я делаю:

<img id="avatar" src="{{ $user->gravatar }}" alt="your image" width="256" height="256"/>

Мутатор работает хорошо: изображение хранится в storage/app/public/avatars каталог. Проблема заключается в доступе: если я использую dd($image); до возврата я вижу данные, но они не отображаются на странице html

0

Решение

Вы пытаетесь отобразить фасад Response как строку, однако вам просто нужно вернуть путь к файлу изображения.

Вы можете использовать функцию url на Storage Facade, чтобы получить путь к изображению:

if($gravatar){
$image = Storage::disk('local')->url('public/avatars/'.$gravatar.'.jpg');
return $image;
}

Потому что вы используете значение для src:

src="{{ $user->gravatar }}"

https://laravel.com/docs/5.4/filesystem#file-urls

редактировать

Из документов:

Помните, что если вы используете локальный драйвер, все файлы, которые должны быть
общедоступный должен быть помещен в хранилище / приложение / публичный
каталог. Кроме того, вы должны создать символическую ссылку на
public / storage, который указывает на каталог storage / app / public.

Как только это будет сделано, ваш возвращенный URL должен отобразить ваше изображение.

1

Другие решения

Других решений пока нет …