LaravelのEloquentモデルのプロパティアクセスをCamelにしてみる

久しぶりの投稿が技術ネタ

SlackのPHPユーザーズ(日本語)のLaravelチャンネルで変数の命名規則をどうしているかという議論がちょっとだけあった。
もう結論も出てるのでSlack上で蒸し返してもしかたないし、モデルのプロパティに関してはスネークケースで妥協すると言うことで落ち着いてるのであえてなにも言うつもりもないしそれでいいと思う。

ことの発端はEloquentモデルはDBのテーブルのカラム名でプロパティアクセス出来るように作られてる。
とはいえLaravelのFramework自体は変数はキャメルケースとなっている。
つまりDBのテーブルカラムがスネークケースの場合はプロパティアクセスはどうしてもスネークケースにならざる得ない。
DBのカラム名はPostgresだとキャメルケースで定義しても全部小文字になったりするものだから、こっちをキャメルケースに変えるということもできればしたくない。

1つの解としては、Eloquentモデルのaccessorとmutatorを使って各モデルごとにすべてのプロパティに対して定義すれば、プロパティアクセスもキャメルケースでアクセス可能だ。
これはSlack上でもこーすればできるという例で上げられていた。
しかし、プロパティアクセスをキャメルケースしたいだけで、各モデルにカラムすべてにaccessorとmutatorを定義するとか、拷問でしかない気がする。

この議論を見たときに思いついたのはこれ

Eloquentモデルを継承して、getAttribute($key)とsetAttribute($key, $value)をオーバーライドする。
$keyをスネークケースに変換して親のget/setAttributeを呼べばaccessorやmutatorを個々に定義しなくてもいいんじゃないか。
あとはすべてのモデルは作成したCamelModelを継承すればプロパティアクセスをキャメルケースで書くことができる。
これくらいの手間ならやってもいい気がする。
しかも、個別にaccessorやmutatorをLaravelのお作法通りに定義してもちゃんと動く。

まぁこれやっちゃうと、必ずスネークケースに変換されてしまうのでDBのカラムがスネークケースじゃないものが含まれてたときにプロパティが取れなくなるけど。
そんときはDBのカラムの命名規則違反だからカラム名を修正すべきだろう。

Laravelで特定のURL以下にフィルターを適応する

最近Laravelを使い始めていろいろと苦悩しています。

ドキュメントを読んでもさっぱりです。
言いたいことが伝わってきません。
まぁドキュメントについてはLaravelに限ったことではありませんけど…

で、本題です。

Laravelで特定のURLにはAuthとかもろもろ前処理をしたいときに

Route::filter('myFilter', function() {
// なんかのフィルタ処理
});

でフィルタを定義して、

Route::get('path', array('before' => 'myFilter'), function() {
  return 'before filter!';
});

で、URLにフィルタを紐付けるわけです。

まぁこれをいろいろなURLでフィルタを使うときにこれを全部書くとかめんどくさすぎる。
一応まとめてやるには公式ドキュメントにはこんなサンプルコードがあるわけですが

Route::filter('myFilter', function()
{
  //
});

Route::when('user/*', 'myFilter');

これだと、https://hoge.com/userにはフィルタがかからない。
あくまでhttps://hoge.com/user/以下に対してだけになる。
https://hoge.com/userにもフィルタをかけたい場合は

Route::when('user', 'myFilter');
Route::when('user/*', 'myFilter');

と、書けばいいんだけど、これはこれでなんか納得行かない
で、ものは試しにと

Route::when('user*', 'myFilter');

ってやったら、どっちにも対応した。
ただし、https://hoge.com/usersってのがあったらこれにもフィルタが掛かってしまう。

グルーピングを使ったほうが楽なんだろうか?
他にスマートな方法があったら教えて。
まぁこのブログには連絡先は書いてないわけだけど