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のカラムの命名規則違反だからカラム名を修正すべきだろう。