CakePHPの orFail
シリーズ
Configure
に、定数ぽい値を持たせていたりしている。
※ イミュータブルじゃなくなるし、constとしたほうが良いのでない?という観点はあります。
※ 「いや、stageによって異なる値を上書きしたりしたいじゃん!」という声もありますが、それはdotenvや環境変数でどうにかなりそうな問題
※ まぁ色々あって、Configure::write()
に寄せているよ!というお話をスタート地点とさせていただきます。
直接 ::write()
メソッドを用いて書き込む〜というよりかは、 config/app.php
のような「設定ファイル」を介在させて食わせて、という風な。
「絶対に設定しないと行けない」という制約
例えば、cakephp/appを見てみると、
App.encoding
は env('APP_ENCODING', 'UTF-8')
と書かれていたりするじゃないですか。
みたいな感じで、
- 環境変数として値を用意して
- Configureに食わせる
という利用シーンはあると思います*1
その中には、「どの環境においても、絶対に設定されていなければ困る」というものもあると思うのです。
Configure::read()
とすると、「キーが存在しなかった場合はnull」を返します。
場合によっては、「nullのまま進んでは困る」と。
このときに役立つのがConfigure::readOrFail()
です。
Class Cake\Core\Configure | CakePHP 3.5
keyが未設定、もしくはされているがnullいなっている 場合に、RuntimeExceptionを投げるようになります。
read()
になっている箇所を置き換えるだけで、「ちょっと事故った、しかし事故が大きくなりすぎる前に気付く」ことがしやすくなります。
まだまだあるぞ! orFail()
シリーズで堅牢なプログラミング
良きようにfail fastになるな、という利点です。
Configure::read()
以外にも、 orFail()
なメソッドはちょこちょこあります。
- SELECTを試みたレコードが1件もなかった場合に例外を投げる
Query::firstOrFail()
- saveを試みて(validation error/ domain rule violationで)保存ができなかった場合に例外を投げる
Table::saveOrFail()
- deleteを試みて、(entityにPKがない / entityが「isNew()」である / domain rule violationで)削除ができなかった場合に例外を投げる
Table::deleteOrFail()
こういった顔ぶれです。 便利ですね😁
*1:最も、「読み出せなかったときのために初期値を用意して扱う」というのが良いのかもしれませんが・・