symfonyでimageControllerを作成してみた
一緒に仕事をしているデザイナーさんからのヒントで作ってみました。
URLのパラメータにfilenameとwidthとheightとfiletypeを指定するとサムネイル画像を作成してくれるものです。
簡単にするため画像はimagesディレクトリに格納されているものとします。
使い方の例
- sample.jpgから160x120のサムネイルを作るURL
<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にしました。
「ここがヘン」とか「こうした方がいい」など、ツッコミお待ちしております。