開発ログ:ドライバーの継ぎ目、URLのバグ、そしてDB設定
今日はプラットフォームの構築に一日を費やした。その中で、一つの設計思想が絶えず浮上してきた。それは、「何を行うか」と「データをどこに保存するか」の間に継ぎ目(seam)を設けなければならない、ということだ。
これにより、メインコードを変更することなく、後でバックエンドを入れ替えることができる。
継ぎ目のパターン
私はオブザーバビリティ・プラットフォームを構築している。これは多くのソースからエラーやメトリクスを収集するものだ。すべてのストレージタスクは同じパターンに従っている。
• 小さなインターフェース(契約)を作成する。 • Eloquentドライバー(実装)を作成する。
ダッシュボードやパイプラインはインターフェースとだけやり取りする。現在は信頼性の高いPostgresを使用している。将来、より高速なデータベースが必要になれば、新しいドライバーを書くだけでいい。ダッシュボードのコードを変更する必要はない。
教訓はシンプルだ。初日から2つ目のドライバーを用意する必要はない。初日に必要なのはインターフェースだ。今、ファイルが一つ増えるだけで、後々の大規模な書き換えを防ぐことができる。
3つの良い習慣
• 二重の識別子を使用する。 内部的な高速ジョインにはオートインクリメントIDを使用する。URLやAPIなど、システム外に出るものにはUUIDを使用する。これにより、行数を非公開に保つことができる。
• Enumを使用する。 ロールやステータスはPHPのEnumに保存する。これにより、UIとロジックが同じ「信頼できる唯一の情報源(source of truth)」を使用することが保証される。
• データをバージョン管理する。 ペイロードには常にバージョンフィールドを含める。新しいオプションフィールドは追加してもよいが、古いフィールドの名前変更や削除は決して行ってはいけない。これにより、古いクライアントが壊れるのを防ぐことができる。
トラッキングURLのバグ
メール・トラッキング・パッケージにバグを見つけた。そのパッケージは、クリックを追跡するためにリンクを書き換える。URLを暗号化し、リダイレクト時にそれを復元する仕組みだ。
問題点:Laravelはメールテンプレート内のリンクをHTMLエスケープする。署名付きURLには「&」文字が含まれる。HTMLでは、これらは「&」になる。
エスケープされた文字列を暗号化すると、URLの中に「&」が残ってしまう。Laravelが署名を検証しようとすると、文字列が変わっているため検証に失敗する。これは署名付きURLにのみ発生するため、発見が難しい。
解決策:URLをキャプチャする前に、HTMLエンティティをデコードする。
設定にデータベースを使用する
管理者がダッシュボードからアプリの設定を変更できる仕組みを構築した。これらの設定はデータベースに保存されるが、アプリは依然として標準の config() 関数を使用してそれらを読み取る。
AppServiceProviderに薄いオーバーレイ(層)を設けている。それがデータベースの設定を読み取り、現在のリクエストに対して config にそれらを流し込む。これにより、他のコードはシンプルかつ標準的な状態に保たれる。
ここに共通するテーマは「境界(boundaries)」だ。どこに継ぎ目を作るかを決める。一度、正しい場所に境界を置けば、あとはすべてがシンプルに保たれる。
