モノノフ日記

普通の日記です

symfonyでimageControllerを作成してみた

一緒に仕事をしているデザイナーさんからのヒントで作ってみました。
URLのパラメータにfilenameとwidthとheightとfiletypeを指定するとサムネイル画像を作成してくれるものです。
簡単にするため画像はimagesディレクトリに格納されているものとします。

使い方の例

<img src="http://yourdomain.com/imagecontroller/sample.jpg/160/120/jpeg" alt="test">
  • 実際に使うケース
    • ここに○○x△△サイズの画像埋め込みたいとかデザイナーが言い出したときなど

まずはモジュール作成

symfony init-module myapp test

サムネイル作成用にsfThumbnailPluginをインストール

symfony plugin-install http://plugins.symfony-project.com/sfThumbnailPlugin

actions.class.php

<?php
class testActions extends sfActions
{
    // image dir
    const IMAGEDIR = '/home/www/myapp/images';

    public function executeIndex()
    {
        // filename
        $filename = $this->getRequestParameter('filename');
        $this->forward404Unless(file_exists(self::IMAGEDIR.'/'.$filename));

        // width & height
        $width = $this->getRequestParameter('width');
        $this->forward404Unless(preg_match('/\d+/', $width));
        $height = $this->getRequestParameter('height');
        $this->forward404Unless(preg_match('/\d+/', $height));

        // filetype
        $type = strtolower($this->getRequestParameter('type'));
        $this->forward404Unless(preg_match('/(jpeg|gif|png)/i', $type));
        $this->getResponse()->setContentType("image/$type");

        // sfThumbnailPlugin
        $thumbnail = new sfThumbnail($width, $height, true, true, 90);
        $thumbnail->loadfile(self::IMAGEDIR.'/'.$filename);
        $this->thumbnail = $thumbnail;
        $this->type = $type;
    }

testSuccess.php

<?php $thumbnail->save(null, "image/$type") ?>

routing.yml

imagecontroller:
  url:   /imagecontroller/:filename/:width/:height/:type
  param: { module: test, action: index }
  requirements: { filename: \w+, width: \d+, height: \d+, type: \w+ }

view.yml

testSuccess:
  has_layout:   false

cache.yml

index:
  enabled:   true
  lifetime:  86400

思いついている問題点

  • アスペクト比が変な画像が来た場合
  • エラー処理(404ページじゃなくて404画像みたいなので代替するとか?)

補足

実際に作ったやつはfilenameの代わりにidを渡してきて、
DBに問い合わせてファイルパスを生成するという仕組みにしてます。
説明を単純化するためfilenameにしました。

「ここがヘン」とか「こうした方がいい」など、ツッコミお待ちしております。