← Заметки и статьи о Laravel PHP

3 декабря 2015 перевод

Laravel Medialibrary — простая работа с изображениями

Почти во всех проектах в современных интернетах требуется возможность прикрепления изображений к сущностям. Данный пакет делает работу с изображениями крайне простым занятием.

Прикрепление изображений к сущности

После установки и настройки пакета (пара строк в модели, публикация и настройка конфига и миграция) мы можем прикреплять изображения к сущностям, например, так:

$newsItem = News::find(1);

// $pathToFile — путь к файлу на диске
$newsItem->addMedia($pathToFile)->toCollection('images');

// Файл из запроса
$newsItem->addMedia($request->file('image'))->toCollection('images');

// Файл по URL
$url = 'http://medialibrary.spatie.be/assets/images/mountain.jpg';
$newsItem->addMediaFromUrl($url)
         ->toMediaLibrary();

Получение прикреплённых изображений

И, соответственно, получать прикреплённые изображения (кстати, это могут быть не только изображения, но и любые другие файлы) так:

$mediaItems = $newsItem->getMedia();

// Публичный URL
$publicUrl = $mediaItems[0]->getUrl();

// Путь на диске
$fullPathOnDisk = $mediaItems[0]->getPath();

// Размер файла, например, 1 GB, 1,5 MB
$mediaItems[0]->humanReadableSize;

// ... и многое другое

Удаление изображений

Удаляем изображения так:

// Удаление конкретного файла
$mediaItems[0]->delete();

// Удаление всех файлов, связанных с сущностью
$newsItem->clearMediaCollection();

Дополнительные опции, нарезка и другие манипуляции

Пакет умеет работать с различными файловыми системами, например, с тем же s3 или Dropbox, главное, чтобы они были установлены и настроены в вашем Laravel приложении.

Настройки хранения изображений достаточно гибкие, можно указать, как будут храниться изображения в файловой системе, в каких папках и т.д. с помощью класса, например, так.

И, конечно же, можно указать, до каких размеров нарезать изображения при сохранении (причём размеры можно менять в будущем и с помощью artisan команды перенарезать изображения).

Размеры для нарезки могут указываться глобально для сущности:

use SpatieMediaLibraryHasMediaInterfacesHasMediaConversions;
use SpatieMediaLibraryHasMediaHasMediaTrait;

class News extends Model implements HasMediaConversions
{
    use HasMediaTrait;

    public function registerMediaConversions()
    {
        $this->addMediaConversion('thumb')
             ->setManipulations(['w' => 368, 'h' => 232])
             ->performOnCollections('images');
    }
}

или индивидуально для конкретного изображения:

$mediaItems[0]->manipulations = ['thumb' => ['w' => 100, 'h' => 100]]

И получаем thumb так:

$mediaItems[0]->getUrl('thumb');

Помимо указания размеров можно задавать в параметрах дополнительные манипуляции с изображениями, которые поддерживает Glide — пакет, на котором основаны манипуляции с изображениями. Текущая версия используемого Glide — 0.3, поэтому пока нет всей палитры дополнительных манипуляций, например, ватермарков. Но после релиза Glide 1.0 это будет исправлено.

Также очень часто требуется, чтобы у изображений были дополнительные параметры, например, если это изображение из слайдера, то полезно будет иметь возможность задать кастомную вёрстку/текст. Или отметить изображение аватаром. Всё это также может быть легко реализовано с помощью пакета, а именно с помощью возможности задания кастомных опций у изображения:

// Добавление параметров
$media[0]->setCustomProperty('avatar', $request->get('avatar'));
$media[0]->setCustomProperty('text', $request->get('text'));

// Получение, второй параметр — это значение по умолчанию
$media[0]->getCustomProperty('avatar', false);
$media[0]->getCustomProperty('text', 'No text');

Заключение

Работа с изображениями ещё никогда ещё не была настолько простой. Всем рекомендую данный пакет — laravel-medialibrary.

P. S. Данная статья не была заказана разработчиками пакета )

Источник: http://medialibrary.spatie.be/

Плюсануть
Поделиться
Отправить