背景
PR #233 (Issue #229 — tracker を static singleton から instance + DI に refactor) のレビューで type-design-analyzer agent が指摘した技術負債。
OpenApiResponseValidator::__construct() に追加した ?StrictRequiredTracker $strictRequiredTracker = null (optional + fallback to StrictRequiredTracker::current()) は、本来 DI を受けられるコンストラクタ呼び出しサイトに service-locator を逆輸入する形になっており、type-design-analyzer の以下の指摘がそのまま当てはまる:
The validator is a constructor-built object that already receives DI elsewhere; the ?StrictRequiredTracker = null fallback re-imports the locator into a site that did not need it. Make it required (StrictRequiredTracker $tracker) and let the Laravel trait pass StrictRequiredTracker::current() explicitly at the boundary. The seam should stop at the trait, not propagate.
なぜ PR #233 で対応しなかったか
OpenApiResponseValidator::__construct() の signature は v1.x の SemVer-frozen public API(UPGRADING.md の "Public class names / namespaces / method signatures / constants")に含まれる。
required にすると外部ユーザー側の呼び出しコードが書き換え必須になるため、SemVer-major bump のタイミングで初めて取り込めるべき変更。
現状
src/OpenApiResponseValidator.php (PR #233 マージ後):
```php
public function __construct(
int $maxErrors = 20,
array $skipResponseCodes = self::DEFAULT_SKIP_RESPONSE_CODES,
?StrictRequiredTracker $strictRequiredTracker = null,
) {
// ...
$this->strictRequiredTracker = $strictRequiredTracker;
}
```
そして maybeRecordStrictRequired() 内で:
```php
$tracker = $this->strictRequiredTracker ?? StrictRequiredTracker::current();
$tracker->recordOn(/* ... */);
```
やること(v2 release branch / major bump 時)
__construct() の ?StrictRequiredTracker $strictRequiredTracker = null を StrictRequiredTracker $strictRequiredTracker に変更(required + non-nullable)。
maybeRecordStrictRequired() の null-coalesce を削除し、$this->strictRequiredTracker->recordOn(...) の直呼びにする。
- Laravel
ValidatesOpenApiSchema trait の cached-validator 構築箇所で StrictRequiredTracker::current() を明示的に渡す。
tests/Unit/OpenApiResponseValidatorTest.php 等の new OpenApiResponseValidator() 呼び出しサイトを軒並み更新(new StrictRequiredTracker() をその場で渡す)。
- UPGRADING.md v1 → v2 セクションに breaking change として追記。
ゴール
OpenApiResponseValidator のコンストラクタが locator-fallback を持たない(service-locator の漏れがコンストラクタ層で止まる)。
- 既存テストが
new StrictRequiredTracker() を明示的に渡す形に書き換わっている。
- v2 UPGRADING で breaking change として記載。
StrictRequiredTracker::current() を呼ぶ production 呼び出しサイトは Laravel trait と PHPUnit extension の bootstrap のみ。
関連
背景
PR #233 (Issue #229 — tracker を static singleton から instance + DI に refactor) のレビューで type-design-analyzer agent が指摘した技術負債。
OpenApiResponseValidator::__construct()に追加した?StrictRequiredTracker $strictRequiredTracker = null(optional + fallback toStrictRequiredTracker::current()) は、本来 DI を受けられるコンストラクタ呼び出しサイトに service-locator を逆輸入する形になっており、type-design-analyzer の以下の指摘がそのまま当てはまる:なぜ PR #233 で対応しなかったか
OpenApiResponseValidator::__construct()の signature は v1.x の SemVer-frozen public API(UPGRADING.md の "Public class names / namespaces / method signatures / constants")に含まれる。__construct(int $maxErrors = 20, array $skipResponseCodes = self::DEFAULT_SKIP_RESPONSE_CODES)?StrictRequiredTracker = null(optional — 既存呼び出しサイトは無変更で OK)StrictRequiredTracker $tracker(required — 既存のnew OpenApiResponseValidator()呼び出しが全部破壊される)required にすると外部ユーザー側の呼び出しコードが書き換え必須になるため、SemVer-major bump のタイミングで初めて取り込めるべき変更。
現状
src/OpenApiResponseValidator.php(PR #233 マージ後):```php
public function __construct(
int $maxErrors = 20,
array $skipResponseCodes = self::DEFAULT_SKIP_RESPONSE_CODES,
?StrictRequiredTracker $strictRequiredTracker = null,
) {
// ...
$this->strictRequiredTracker = $strictRequiredTracker;
}
```
そして
maybeRecordStrictRequired()内で:```php
$tracker = $this->strictRequiredTracker ?? StrictRequiredTracker::current();
$tracker->recordOn(/* ... */);
```
やること(v2 release branch / major bump 時)
__construct()の?StrictRequiredTracker $strictRequiredTracker = nullをStrictRequiredTracker $strictRequiredTrackerに変更(required + non-nullable)。maybeRecordStrictRequired()の null-coalesce を削除し、$this->strictRequiredTracker->recordOn(...)の直呼びにする。ValidatesOpenApiSchematrait の cached-validator 構築箇所でStrictRequiredTracker::current()を明示的に渡す。tests/Unit/OpenApiResponseValidatorTest.php等のnew OpenApiResponseValidator()呼び出しサイトを軒並み更新(new StrictRequiredTracker()をその場で渡す)。ゴール
OpenApiResponseValidatorのコンストラクタが locator-fallback を持たない(service-locator の漏れがコンストラクタ層で止まる)。new StrictRequiredTracker()を明示的に渡す形に書き換わっている。StrictRequiredTracker::current()を呼ぶ production 呼び出しサイトは Laravel trait と PHPUnit extension の bootstrap のみ。関連