Yii2: Ресайз на лету

Автоматическое изменение размеров изображений на лету для Yii2 Framework.

  1. Устанавливаем Imagine
  2. Создаем модуль thumb (можно создать в Gii)
  3. Создаем модель RZImage:
<?php

namespace app\models;

use Yii;
use yii\imagine\Image;

class RZImage
{

    private $static;
    public $original;
    public $width;
    public $height;
    public $result;

    public function __construct($width, $height, $image) {
        $this->static = 'assets/static/';
        $this->width = $width;
        $this->height = $height;
        $this->original = $image;
        $this->result = $this->static . $this->width . 'x' . $this->height . '/' . $this->original;
    }

    public function originalExists() {
        return file_exists(Yii::getAlias('@webroot/') . $this->original);
    }

    public function resultExists() {
        return file_exists(Yii::getAlias('@webroot/') . $this->result);
    }

    private function checkFolder() {
        if(!is_dir(Yii::getAlias('@webroot/') . pathinfo($this->result, PATHINFO_DIRNAME))) {
            return mkdir(Yii::getAlias('@webroot/') . pathinfo($this->result, PATHINFO_DIRNAME), 0777, true);
        }
        return true;
    }

    public function getThumbnail() {
        if( $this->originalExists()) {

            if(!$this->resultExists()) {
                if($this->checkFolder()) {
                    Image::thumbnail(Yii::getAlias('@webroot/') . $this->original, $this->width, $this->height)->save(Yii::getAlias('@webroot/') . $this->result, ['quality' => 80]);
                } else {
                    throw new \yii\web\HttpException(424 ,'Не удалось создать папку для хранения превью.');
                }
            }
            return Yii::getAlias('@web/') . $this->result;

        } else {
            throw new \yii\web\HttpException(410 ,'Файл не найден. Скорее всего он был удален.');
        }
    }
}

?>
  1. Создаем контроллер CropController
<?php

namespace app\modules\thumb\controllers;
use yii\web\Controller;
use app\models\RZImage;

/**
 * Default controller for the `thumb` module
 */
class CropController extends Controller
{
    /**
     * Renders the index view for the module
     * @return string
     */
    public function actionIndex($width, $height, $original)
    {
        $image = new RZImage($width, $height, $original);
        $thumbnail = $image->getThumbnail();
        return $this->redirect($thumbnail);
    }
}

?>
  1. Добавляем правило в UrlManager:
'/thumb/crop/<width:[\d-]+>/<height:[\d-]+>/<original:.*?>' => '/thumb/crop'

P.S. В модель нужно добавить еще автоочистку кэша.

На главную