Ethna

気がつけばPHPフレームワークのEthnaを使い始めて3年が経ちました。 さすがに3年も使うと大分煮詰まってきますので、普段どういった使い方をしているのか紹介したいと思います。

architectonics

全体の構成としてはこんな感じで使用しています。 基本的にEthna本体はカスタマイズはしていないのですが、4点程標準にはない機能を追加しています。

Call other action

一応、標準機能として別のアクションを呼び出す機能がありますが、パラメーターの設定ができないのでそこをカスタマイズしています。

$this->backend->perform('action_name', $paramater);

滅多に使う機能ではないのですが、パラメーターの指定をできるようになるだけで再利用性がかなり高まります。

Redirect

Ethnaのフィルタ機能を使用して、リクエストパラメーターにredirectを指定されていた場合にリダイレクトする機能を付与しています。 とはいえ、無条件にリダイレクトさせるとまずいので、

  • Viewが存在しない
  • 同一ドメイン内のリダイレクト

という条件のときのみリダイレクトするようにしています。 後述のRendererと絡みで必要になる機能ですが、

http://domain.com/data/create?redirect=actionname

みたいに指定すれば遷移先を指定できるので、画面遷移をtemplateに集約することができます。

Renderer

リクエストパラメーターのresponseにCSVやJSONが指定されたさいに、そのフォーマットでレスポンスを返すようにしています。 何も指定されなければtemplateをそのまま返します。 例えば検索画面で表示している項目をCSVで出力するときにわざわざ二つのActionを作る必要がなくなります。 また、スマホ対応するときにAjax用のAPIを作成しなくてもJSONと指定すればAPI代わりになってくれたりとなかなか便利です。

Exception

Exceptionは全てエントリポイントでキャッチするようにしています。 前は各Actionなどでキャッチしていたのですが、チームで開発しているとキャッチ漏れが出てしまっていたのでエントリポイントに集約させるようにしています。

try {
    Ethna_Controller('Ethna_Controller', 'index', '404');
} catch (Exception $e) {
    // ログにエラーを書き込む
    // Exceptionに対応する画面にリダイレクト
}

基本的にPHPでExceptionが発生するときは本当に致命傷なことが多いので、集約させても特に問題なかったりします。


他にもいろいろと弄ってはいますが、大きな変更としてはこんな感じです。 気が向いたら他にもフォルダ構成とか、細かい変更点を公開していこうかなと思います。