Skip to content

Conversation

@nanasess
Copy link
Contributor

@nanasess nanasess commented Oct 7, 2025

概要(Overview・Refs Issue)

PHPの型宣言を適用し、PHPStan Level 6の静的解析に対応するための変更です。

主な変更内容:

  • PHPStan Level 6 対応(型注釈の追加・修正)
  • ./vendor/bin/patch-type-declarations による型宣言の自動適用
  • 型宣言エラーの修正
  • mixed 型をより具体的な型に変更
  • bcmul() 精度パラメータの修正
  • Rector ルールの適用

方針(Policy)

  • 後方互換性を維持しながら、段階的に型の厳密性を向上
  • PHPの型システムに準拠した型宣言を適用
  • PHPDocとネイティブ型宣言の整合性を確保

実装に関する補足(Appendix)

型宣言エラーの修正

  • void 型関数が値を返すエラーを修正
    • Controller の moveSortNo(): void → Response + トークン無効時の例外処理追加
    • CartService::getUser(): void → ?UserInterface
    • CacheUtil::forceClearCache(): void → string
  • マジックメソッド __set(): mixed → void(PHP仕様に準拠)
  • ItemHolderInterface のセッターメソッド: ItemHolderInterface → self(メソッドチェーン対応)
  • ジェネリック型パラメータ T の型宣言エラー修正(?T → ?object)

影響範囲

  • 変更ファイル数: 564ファイル
  • 追加行数: 9,434行 / 削除行数: 4,614行

テスト(Test)

  • bin/console コマンドが正常に動作することを確認
  • PHPUnit テストが全て通過することを確認
  • PHPStan Level 6 で静的解析エラーがないことを確認
  • E2E テストの実行確認

相談(Discussion)

特になし

マイナーバージョン互換性保持のための制限事項チェックリスト

  • 既存機能の仕様変更はありません
  • フックポイントの呼び出しタイミングの変更はありません
  • フックポイントのパラメータの削除・データ型の変更はありません
  • twigファイルに渡しているパラメータの削除・データ型の変更はありません
  • Serviceクラスの公開関数の、引数の削除・データ型の変更はありません(型宣言の追加のみ)
  • 入出力ファイル(CSVなど)のフォーマット変更はありません

レビュワー確認項目

  • 動作確認
  • コードレビュー
  • E2E/Unit テスト確認(テストの追加・変更が必要かどうか)
  • 互換性が保持されているか
  • セキュリティ上の問題がないか
    • 権限を超えた操作が可能にならないか
    • 不要なファイルアップロードがないか
    • 外部へ公開されるファイルや機能の追加ではないか
    • テンプレートでのエスケープ漏れがないか

🤖 Generated with Claude Code

nanasess and others added 5 commits October 6, 2025 14:16
./vendor/bin/patch-type-declarations 実行後に発生した致命的エラーを修正:

- void 型関数が値を返すエラーを修正
  - Controller の moveSortNo() メソッド: void → Response に変更し、トークン無効時の例外処理を追加
  - CartService::getUser(): void → ?UserInterface に変更
  - CacheUtil::forceClearCache(): void → string に変更
  - PointProcessor::addDiscountItem(): void → ?ProcessResult に変更(インターフェースも修正)

- 戻り値型の不整合を修正
  - OrderPdfRepository::save(): bool → void に変更(AbstractRepository と互換性を確保)
  - ComposerServiceFactory::createService(): 冗長な object 型を削除

- マジックメソッドの型修正
  - AbstractMasterEntity::__set(): mixed → void に変更(PHP 仕様に準拠)

- インターフェースの型定義を改善
  - ItemHolderInterface のセッターメソッド: ItemHolderInterface → self に変更(型安全性向上)
  - ItemHolderInterface::getShippings(): ArrayCollection → Collection に変更

これにより bin/console コマンドが正常に動作するようになりました。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
patch-type-declarations 実行後に mixed になった返り値の型を、
実際の戻り値に基づいてより具体的な型に修正:

- データベース関連: false|string, string
- 管理画面統計: array, int|string|null
- Doctrine型変換: ?string, ?\DateTimeInterface
- エンティティ: ?Master\OrderStatus
- コレクション: string
- 設定管理: ?array, ?string
- PDF出力: string
- 状態遷移: ?\Symfony\Component\Workflow\Transition

修正完了: 19件
仕様上mixed保持: 14件(DIコンテナ、マジックメソッド等)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
PHPStan 静的解析で検出されたエラーを修正:

- AbstractEntity::offsetGet(): 戻り値が欠落していた問題を修正
  - メソッドが見つからない場合に null を返すように修正

- EntityToIdTransformer::reverseTransform(): ジェネリック型 T を使用した型宣言エラーを修正
  - ネイティブ型宣言を ?T から ?object に変更(PHPDoc で @return T|null を維持)

- PHPDoc の @return 型アノテーションを修正
  - AdminController: array → array<string, int>
  - InstallController::getSessionData(): array → mixed
  - Controller の moveSortNo(): Response|void → Response

- ItemHolderInterface 実装クラスの戻り値型を統一
  - Cart/Order/CartItem/OrderItem の setter メソッド: void → static に変更
  - setDiscount/setCharge/setTax: メソッドチェーン対応のため static を返すように修正

- Composer サービスの @return mixed アノテーションを追加

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
This commit removes redundant `(string)` type casting from multiple methods across the codebase. The changes improve code readability and maintainability without altering functionality.
@nanasess nanasess force-pushed the apply-type-declarations branch from c2b28ee to 1c040e5 Compare October 7, 2025 05:39
Updated return types in `Cart` and `Member` entities to improve type safety and align with modern PHP standards.

- Changed `setTotalPrice` and `setTotal` methods in `Cart` to return `static` instead of `Cart`.
- Updated `getSalt` method in `Member` to return `?string` instead of `string`.
@shinya
Copy link
Contributor

shinya commented Oct 8, 2025

うちの会社でもPHPStan使ってて、この方宣言がないとめっちゃ怒られます。
とはいえ暗黙変換の予防になるのでめっちゃいいですよね。
一方で、暗黙的だからこそ使えていた部分がstrictになるので、結構メソッドの構造から変えないといけない箇所とかも出てくるので最初の移行が結構大変。しかしこれを乗り越えたら、あとが楽になる!
応援してます。

Updated return types in various entity and service methods to reflect nullable values. This improves type safety and aligns with modern PHP practices.
Updated test cases to use string type for numeric values in assertions to ensure consistency and prevent type-related issues.
@nanasess nanasess force-pushed the apply-type-declarations branch from 4933177 to 2425a88 Compare October 8, 2025 05:36
nanasess and others added 2 commits October 8, 2025 14:40
型定義付与ツール適用後のPHPUnitエラー(約30件)を修正。

## 修正内容

### 主な修正
- Shipping::getMailSendDate(): \DateTime → ?\DateTime
- ClassName::getBackendName(): string → ?string

### 全エンティティ(32ファイル)
getCreateDate()とgetUpdateDate()の戻り値型を修正:
- public function getCreateDate(): \DateTime → ?\DateTime
- public function getUpdateDate(): \DateTime → ?\DateTime

## 根本原因

1. 型定義付与ツールがnullable=trueのカラムに対して非nullable型を設定
2. 新規エンティティ作成時(未保存状態)にcreate_date/update_dateがnull
3. Twigテンプレート描画時にTypeErrorが発生し500エラー

## 解決したエラー

- OrderControllerTest: 8件
- ClassCategoryControllerTest: 3件
- ProductControllerTest: 1件
- その他管理画面テスト: 約18件
合計: 約30件のエラーを解決

## 対象エンティティ

AuthorityRole, BaseInfo, Block, Calendar, Cart, Category,
ClassCategory, ClassName, Csv, Customer, CustomerAddress,
CustomerFavoriteProduct, Delivery, DeliveryTime, Layout,
LoginHistory, MailTemplate, Member, News, Order, OrderPdf,
Page, Payment, Plugin, Product, ProductClass, ProductImage,
ProductStock, ProductTag, Shipping, TaxRule, Template

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
PHPUnitテストで発生していた型エラーを修正:

- PaymentResult::getResponse(): Response|null に変更し、nullチェックを追加
- Tag::getName(): string|null に変更し、__toString()でnull対応
- Order::getUsePoint(): string|null に変更(PointTrait/ItemHolderInterface)
- HelpControllerTest: デバッグ用のエラーメッセージを追加

これにより以下のテストエラーが解消:
- ShoppingControllerTest::testCompleteWithLogin 他7件(PaymentResult)
- TagControllerTest::testEditInvalid(Tag::getName)
- ShoppingControllerTest::testPaymentWithError(Order::getUsePoint)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <[email protected]>
@nanasess nanasess force-pushed the apply-type-declarations branch from 2425a88 to 0aa0d94 Compare October 8, 2025 05:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants