{ 2012.12.25 }

Filebinder pluginの今 #cakeadvent2012 Day25

    はてなブックマーク - Filebinder pluginの今 #cakeadvent2012 Day25
    このエントリーをはてなブックマークに追加

    CakePHP Advent Calendar 2012 25日目の記事です。

    24日は@takahashiyuyaさんの「Cakephp h()メソッドから php を学ぶ」です。

    h()が意外に配列にも対応しているというのはソースを見ないと気づかないですよね。

    さて、ラストは今年のPHPMatsuriで「変態」と言われ続けたFusicよりお送りいたします。

    非常に心外ですので、
    本エントリで「Fusicは変態」という汚名を払拭したいと思います。

    Filebinder Pluginとは

    弊社がGitHubリポジトリで提供しているCakePHP Pluginに「Filebinder」というものがあります。

    fusic/filebinder

    簡単にいうとCakePHPのファイルアップロード機能を簡単に実装するためのプラグインです。

    最初のリリースはCakePHP1.3の頃で、そこから継続的にメンテナンスしています。
    現在はmasterブランチではなく2.0ブランチのみの開発を続けていますので、そのうちブランチ名を切り替えるかもしれません。

    弊社では未だにデファクトのライブラリなのですが、一部では「過去のライブラリ」となってしまっていそうなので、そうならないように「あれからFilebinderはどうなっているのか」について紹介したいと思います。

    CakePHP2.x対応

    弊社では現在CakePHPの主流は2.x系です。

    意外に知られていませんが、FilebinderもCakePHP2.x対応をしています(2.0ブランチ)。
    ブランチ名については後悔しています。。

    使い勝手も変えていませんので是非確認してみてください。

    UnitテストをTravis CIで管理

    弊社では良く使う重要なライブラリですので、少ないですが必要最低限のテストを書いています。

    最初は、開発者である私の環境でテストを回した後にpushをしていたのですが、
    ふと思うことがあってTravis CIの力を借りてテストを回しています

    README.mdにグリーンアイコンがでるのは、使う側としても安心ですよね。

    1.3系2.x系両方でTravis CIを回しているので、CakePHP PluginのテストをTravis CIに任せてみたい人には参考になるかもしれません。

    AmazonS3に対応

    おそらく、かつてから最も変わった部分ではないでしょうか。

    弊社にもご多分に漏れずAWSな波がきておりまして、FilebinderもAmazonS3に対応させていたりします。

    簡単にいうと、ファイルをアップロードするとS3に(も)転送する機能が簡単な設定だけで利用できます(Amazonから提供されているSDKを利用しています)。
    データベースと同様に、S3のデータからローカルのデータを復活させるようなことも可能です。

    README.mdに書くのをサボっていたので(ちょっと書きました)、テストケースを読むような人でない限り気づかなかったとは思いますが、便利です。S3に保存できると安心感が違います。

    現在開発中のzenpreでもスライドデータなどをS3、さらにはCloudFrontに任せることで負荷を軽減させています。

    実はCDP:Rename Distributionパターンを構築しやすい

    Filebinderはファイルの保存先をModel::transferTo()を上書きすることで変更できるのですが、それを活用してCDP:Rename Distributionパターン(リンク参照)をものすごく容易に実装できます。

    例えば以下のようにすれば、タイムスタンプごとにディレクトリを切ってファイルを保存できます。

    /**
    * transferTo
    * Filebinder BindableBehavior::transferToをオーバーライド
    * CDP:Rename Distributionパターン
    *
    * @param $data
    */
    public function transferTo($data){
    $time = preg_replace('/[\s:-]/','', $data['modified']);
    return $this->alias . DS . $data['model_id'] . DS . $time . DS . $data['field_name'] . DS . $data['file_name'];
    }

    Filebinderの機能でそのままS3にアップロードし、CloudFrontと連携させればもう完成です。楽ですね。
    上記機能は実は弊社ではなく、@jyokyokuさんが追加した実装です。OSSの醍醐味ですね。この場をかりてお礼を言いたいと思います。ありがとうございます!

    というわけで

    「Filebinder pluginの今」の紹介でした。慣れれば使いやすく拡張しやすいと思いますので、是非使ってみてください。

    Fusicの汚名も無事払拭できたかと思います。

    CakePHP Advent Calendar 2012も無事完走いたしました(誰かが走り続ける可能性もありますが)。皆さんお疲れ様でした。

    あ、4回目です。すみません。

    Comments are closed.