#初めに
この記事はAdvent Calendar FuelPHPの15日目です。
今日までにFuelPHP含め色々なAdvent Calendarに様々な投稿があり、皆様の頭もいっぱいいっぱいだろうと存じます。
ということで、ここらで骨休めとして簡単な話でも眺めていきましょう。
内容としましては、FuelPHPを少しやってみて困ったことなどを羅列していこうと思います。
Advent Calendarを読まれているような諸兄の皆様には当たり前じゃんと思われるかもしれませんが、生暖かい目で見てくれれば助かります。
#FormatクラスだけどTSV使いたい
ある時TSVを扱う必要があったのですが、残念なことにFormatクラスにはTSV用のメソッドがなかった。悲しい。ただ、以下のようにdelemiterを変えることで扱えるようにはなる。
\Config::load('format');
\Config::set('format.csv.delimiter', "\t");
$tsv = \Format::forge(\File::read(APPPATH . '/../tmp/test.tsv', true), 'csv');
しかしcsvとして扱うのが非常に気持ち悪いし、やってはいないですが、tsvからcsvに変換するような処理を書くときにconfigをsetし直すなんてことをやらなきゃいけないので面倒です。なので、拡張して_from_tsvメソッドを定義するのが良いのでしょうね。
まずなんでTSVなんていう微妙なやつを使わなければならなかったかってことですが、そこは闇が深いので無視していただきたい。
#Imageクラスを利用すると画像が劣化しちゃう
ある時コントローラを介して画像を返すAPIちっくなものを実装する必要がありました。FuelPHPにはImageクラスがあり、そこにoutputというメソッドがありました。これはヘッダを設定して画像を返してくれる便利メソッドです。
じゃあこれを使えばいいじゃん! となって、究極的にいえば以下のコードを書いたわけです。
class ControllerImage {
public function get($id) {
return Image::load($id . '.png')->output();
}
}
画像も平和に出力されやった簡単だねみたいに思ってたのですが、別のところから指摘があって、画像が劣化していることがわかりました。
loadしてoutputしてるだけなのになんで劣化するの!?と思ったわけですが、直接Imageクラスを読んでみると、loadした段階でコンバートなりをかけていることがわかりました。これがconfigのimage.phpのquallityを100にしても劣化しちゃう。しかもそこそこ重い。仕方がないのでImageクラスを使わず、自前でヘッダを返すようにしました。
#taskとwebアクセス時でDOCROOTが違う
FuelPHPを使ってる方には常識かもしれませんが、taskを実装する時とwebでアクセスした時のDOCROOTの値が違うという現象。これはバグなどではなく仕様です。DOCROOTは起動スクリプトだから、とのこと(oilコマンドで起動する場合は、oilコマンドのディレクトリが起動スクリプトということなのでしょう)。以下で議論されてました。
http://fuelphp.com/forums/discussion/8023。
でもConfigとかで設定を共有したい場合ってあるじゃん? 同じパスを利用したい時ってあるよね? 仕方ないのでAPPPATHからたどるようにしました。これはどうするのが一番いいんでしょうね。
#Langクラスのロードはキャッシュされる
これも使われてる方には常識っていうかなんで知らないの? って話なのかもしれませんが、Lang::load()を一回やっちゃうとキャッシュされて新たに読み込み直すときにはちゃんとフラグを渡してあげないとキャッシュがあるからと読み込んでくれない。ドキュメントをちゃんと読めってやつですね。
#ファイル名がわかりづらい
これは私以外の人から上がった意見ですが、ファイル名だけ見ていると今自分がどこのファイルを編集しているのかがわかりづらいということがありました。IDEなんかでは上にタブでファイル名が並ぶわけですが、view modelやコントローラー名、viewを同じにしていると、どのファイルがどれなのかというのがわかりにくい。みんな、例えばindex.phpだったりするわけです。
かといってフルパスを表示させるためには余白が足りない。ファイル名を変えたら今度はどこと関連づいてるのかわかりづらい気がする。これもどうしたらよいのでしょうね?
#まとめ
適当に困ったことや思ったことを羅列してみました。
中身のない話でしたが、ちょうど真ん中あたりですし、息抜き程度に思って見ていただけたらと思います。
皆さんも困ったこととかありますかね?