Skip to content

tech-debt(validator): make OpenApiResponseValidator strictRequiredTracker ctor param required (v2) #234

@wadakatu

Description

@wadakatu

背景

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")に含まれる。

  • 旧: __construct(int $maxErrors = 20, array $skipResponseCodes = self::DEFAULT_SKIP_RESPONSE_CODES)
  • PR refactor(coverage,strict_required): instance + DI trackers (#229) #233 で追加: ?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 時)

  1. __construct()?StrictRequiredTracker $strictRequiredTracker = nullStrictRequiredTracker $strictRequiredTracker に変更(required + non-nullable)。
  2. maybeRecordStrictRequired() の null-coalesce を削除し、$this->strictRequiredTracker->recordOn(...) の直呼びにする。
  3. Laravel ValidatesOpenApiSchema trait の cached-validator 構築箇所で StrictRequiredTracker::current() を明示的に渡す。
  4. tests/Unit/OpenApiResponseValidatorTest.php 等の new OpenApiResponseValidator() 呼び出しサイトを軒並み更新(new StrictRequiredTracker() をその場で渡す)。
  5. 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 のみ。

関連

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions