このようなクエリを書く者は悔い改めよ:
WHERE id=? AND owner_id=?
結果レコードがなかったとき、こう書く羽目になるであろう:
$item = $query->fetch();
if (!$item) {
throw new NotFoundException();
}
owner_id
と一致しない者がアクセスしたときは 403 Forbidden にして欲しいと顧客が求める可能性はないのか。拡張に対してオープンであろうとする配慮をなぜできないのか。
そもそも、プライマリキーで十分高速にレコードを特定できている時点で、データベースの責務は終わっているのだ。なぜ貴様らは SQL などというモデリング言語外の文字列 にユースケースを実装するのか。
正しいコードを示そう。
WHERE id=?
$item = $query->fetch();
if (!$item) {
throw new NotFoundException();
} elseif ($item->owner_id != $user->id) {
throw new ForbiddenException();
}
どうだ、owner_id
の一致がなぜ必要なのかは、データを取り出す責務層ではなく、アクセスコントロールを意識する層にあるのが自然ではないか。
ここでクエリのモックを使えば、実データベースにアクセスせずとも、この 「なければ 404 でアクセス禁止なら 403」 を TDD でモデリング可能。この程度のことで、なぜデータベースフィクスチャなどという高速なテストサイクルを邪魔するものに依存せねばならんのか。
(ネタです)