開発ログ:ドライバーの継ぎ目、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)」だ。どこに継ぎ目を作るかを決める。一度、正しい場所に境界を置けば、あとはすべてがシンプルに保たれる。

出典: https://dev.to/nasrulhazim/dev-log-2026-06-25-driver-seams-everywhere-a-tracking-url-bug-and-db-backed-settings-442l