Блог веб-разработчика v 1.0.0
Symfony2, AngularJS, React, Gulp, PhpStorm и много других страшных слов

Удобный ресайз изображений в Symfony2

3 года назад
4110 просмотров
PHP PHP Frameworks Symfony2 Полезности

LiipImagineBundle - бандл для манипуляции изображениями в Symfony2. Так написано в документации, но документацию мы читаем обычно в крайнем случае, поэтому, проще говоря, это бандл для удобного создания превью-изоражений. Допустим, есть у вас в новости картинка 2000х1500px. Ее нельзя показывать в исходном виде, т.к. она сожрет весь трафик и страница будет весить адски много, соответственно нужно ужать картинку до адекватных размеров, т.е. показать уменьшенную копию. Этим и занимается данный бандл.

Установка

Как обычно, используем Composer:

$ php composer.phar require "liip/imagine-bundle:dev-master"

Затем добавляем бандл в AppKernel.php:

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...

        new Liip\ImagineBundle\LiipImagineBundle(),
    );
// ... }

И не забываем добавить роуты:

# app/config/routing.yml

_liip_imagine:
    resource: "@LiipImagineBundle/Resources/config/routing.xml"

Настройка

По сути настройка заключается в создании "размеров картинки". Т.е. мы создаем именованный набор параметров по которым изображение будет ужато-прежато и сманипулировано. Давайте посмотрим на полный стандартный конфиг:

liip_imagine:

    resolvers:
        default:
            web_path:
              web_root: ~ # %kernel.root_dir%/../web
              cache_prefix: ~ # media/cache


    loaders:
        default:
            filesystem:
                data_root: ~  # %kernel.root_dir%/../web/

    driver:               gd # Я бы рекомендовал использовать imagick
    cache:                default
    data_loader:          default
controller: filter_action: liip_imagine.controller:filterAction filter_runtime_action: liip_imagine.controller:filterRuntimeAction
filter_sets: # Прототип для параметров ресайза изображения name: path: ~ quality: 100 animated: false format: ~ cache: ~ data_loader: ~ controller: ~ route: [] filters: # Прототип фильтра name: []

Пример использования

Конечно никто не заставляет писать весь этот конфиг, давайте для примера обойдемся минимальным:

# app/config/config.yml

liip_imagine:
    resolvers:
       default:
          web_path: ~ 

    filter_sets:
        cache: ~
        my_thumb:
            quality: 75
            filters:
                thumbnail: { size: [120, 90], mode: outbound }

Итак, мы создали и описали фильтр my_thumb: качество изображения 75, сделать превью размером 120х90. На самом деле бандл содержит множество готовых фильтров, например, для создания вотермарка, поворота изображения, обрезания, растягивая/сжатия и даже авто-поворота изображения на основе EXIF данных. Само собой, можно создавать свои фильтры и описывать их поведение в виде обычных PHP классов, хотя для 99% задач вам хватит и стандартного набора.

Фильтр то мы создали, что дальше? Нужно показать наше уменьшенное изображение. В шаблоне это делается так:

<img src="{‌{ '/relative/path/to/image.jpg' | imagine_filter('my_thumb') }}" />

Система сгенерирует путь вида /media/cache/my_thumb/relative/path/to/image.jpg, но само изображение будет создано только при первом обращении по этой ссылке, поэтому о производительности можно не беспокоиться, все на высшем уровне.

Более подробно о возможностях бандла можно узнать из документации.

Что еще почитать