Skip to content

feat: EC-CUBE 4.4への対応#67

Open
ttokoro20240902 wants to merge 14 commits into
4.4from
feat-4.4
Open

feat: EC-CUBE 4.4への対応#67
ttokoro20240902 wants to merge 14 commits into
4.4from
feat-4.4

Conversation

@ttokoro20240902

@ttokoro20240902 ttokoro20240902 commented Jun 24, 2026

Copy link
Copy Markdown

概要

おすすめ商品管理プラグインを EC-CUBE 4.4(Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2+) に対応させ、コードを Recommend42Recommend44 に改名します。4.3 とは非互換(属性必須・ORM 3・PHP 8.2+)のため、新規 4.4 ブランチへの取り込みです。

参考: 4.3→4.4 マイグレーション手順 (doc #346) / 先行対応 eccube-api4 #186 / sample-payment-plugin #53

変更内容

1. EC-CUBE 4.4 対応(コア移行)

  • Annotations → PHP 属性: Entity の @ORM\*#[ORM\*]、Controller の @Route/@Template#[Route]/#[Template]Sensio 依存除去)
  • 型宣言の明示: Entity プロパティの型付け(?int/?string/bool 等)、ゲッター/セッター・各メソッドの戻り値型
  • Doctrine ORM 3.0: flush($entity)flush()
  • Symfony 7: Assert\Length を名前付き引数形式へ
  • AbstractPluginManager: 全メソッドに : void、暗黙 nullable 引数の解消
  • PHPUnit 11: phpunit.xml.dist<source>/<extensions> 形式へ
  • コード名: namespace / composer code / version: 4.4.0 / テンプレート参照を Recommend44 に統一

2. Docker Compose によるテスト環境

  • docker-compose.yml + dev/mysql/pgsql オーバーレイ、dockerbuild/
  • EC-CUBE 4.4 イメージ(ghcr.io/ec-cube/ec-cube-php:8.2-apache-4.4)でプラグインを自動導入・有効化し PHPUnit を実行可能
  • 管理画面ログイン用に APP_ENV=dev 起動+dev 用 Cookie 設定(cookie_secure:false/cookie_samesite:lax)を上書き

3. 静的解析・整形ツール

  • phpstan.neon.dist(level 6)/ Resource/rector.php / Resource/.php-cs-fixer.dist.php を追加(.php 設定は本体の Plugin\: サービス検出で 500 を避けるため Resource/ 配下に配置)
  • rector / php-cs-fixer を適用し、phpstan level 6 を baseline なしでエラーゼロまでクリア(Repository に @extends AbstractRepository<RecommendProduct> を付与する等)
  • CLAUDE.md に開発・テスト手順、アーキテクチャ、移行・配置の注意を記載

4. CI(.github/workflows/main.yml ほか)

  • マトリクスを EC-CUBE 4.4 / PHP 8.2-8.4 / MySQL8・PostgreSQL に更新、checkout@v4$GITHUB_OUTPUT
  • --ignore-platform-req=ext-redis: Symfony 7.4 の symfony/cache が古い php-redis と衝突して本体 composer install が失敗するのを回避(redis は未使用)
  • phpunit 前に cache:warmup: 有効プラグインのルートはコンテナのコンパイル時に確定するため、phpunit プロセスの遅延コンパイルだと RouteNotFoundException が断続的に発生する問題を解消
  • release.yml: 配布パッケージから開発・テスト用ファイル(docker-compose / dockerbuild / CLAUDE.md / phpstan / rector / php-cs-fixer)を除外

テスト

  • EC-CUBE 4.4(8.2-apache-4.4)+ SQLite で PHPUnit 全 24 テスト パス(PHPUnit 11.5 / PHP 8.2)
  • CI 全マトリクス green(4.4 × PHP 8.2/8.3/8.4 × MySQL8/PostgreSQL)
  • phpstan level 6 エラーゼロ(baseline なし)/ php-cs-fixer 差分ゼロ
  • Playwright で管理画面ログイン・「おすすめ管理」画面の表示を確認
  • 配布パッケージ(release.yml 相当)が PharData で展開可能・code=Recommend44 を確認

🤖 Generated with Claude Code

ttokoro20240902 and others added 13 commits June 24, 2026 13:49
Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2+ へ対応し、コードを Recommend44 に改名。

- composer.json: name/code/version を Recommend44・4.4.0 へ
- 全 namespace と @Recommend42 エイリアスを Recommend44 へ改名
- Entity: アノテーション → PHP 属性、型付きプロパティ化、型宣言追加
- Controller: @Route/@template → 属性、戻り値型明示、Sensio 依存除去
- Form: Length 制約を名前付き引数化、戻り値型追加
- PluginManager: 全メソッドに : void、暗黙 nullable 廃止
- Doctrine ORM 3.0: flush($entity) → flush()
- phpunit.xml.dist: PHPUnit 11 形式(source/extensions)へ
- CI: EC-CUBE 4.4 / PHP 8.2-8.4 マトリクス、deprecated action 更新

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
sample-payment-plugin に倣い、EC-CUBE 4.4 + 本プラグインを Docker Compose で
立ち上げて PHPUnit を実行できるようにする。

- docker-compose.yml: ベース(ghcr.io/ec-cube/ec-cube-php:8.2-apache-4.4 + mailcatcher、SQLite、APP_ENV=test)
- docker-compose.dev.yml: プラグインを tar 化し eccube:plugin:install で導入・有効化
  (PharData は先頭 "./" エントリで失敗するため ./* を対象に tar 化)
- docker-compose.mysql.yml / docker-compose.pgsql.yml: DB 切り替え用オーバーレイ
- dockerbuild/grant_to_dbuser.sql: MySQL 用権限付与
- README: 起動・テスト実行手順を追記

あわせて 4.4 移行に伴うテスト期待値を修正:
- Length バリデーションメッセージを Symfony 7.4 の文言へ更新
- getVisible() の boolean 型化に合わせ testRecommendDelete の期待値を false に

動作確認: EC-CUBE 4.4 + PHP 8.2 + SQLite で全 24 テスト パス(PHPUnit 11.5)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
APP_ENV=test ではセッションがモックストレージ(mock_file)になり、実ブラウザで
ログイン状態を保持できなかった。またEC-CUBE 4.4(Symfony 7)の既定 cookie_samesite: none
により HTTP では Cookie が拒否される。

- docker-compose.yml: APP_ENV を test → dev に変更(実セッションが必要なため)
- dockerbuild/dev-framework.yaml: dev 環境の Cookie を cookie_secure:false / cookie_samesite:lax に上書き
- docker-compose.dev.yml: 上記上書きファイルをマウント
- README: PHPUnit は test 環境のキャッシュをクリアしてから実行するよう手順を更新

動作確認: ログイン POST → 302 → ダッシュボード 200(admin/password、HTTP localhost:8080)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
sample-payment-plugin (#53) / eccube-api4 (#186) のモデルケースに倣い、
4.4 対応の保守性向上のため開発ツール設定を追加する。

- phpstan.neon.dist: PHPStan level 6(ルート、neon のため配置可)
- Resource/rector.php: Symfony 7.4 / Doctrine ORM 3 への rector 設定
- Resource/.php-cs-fixer.dist.php: php-cs-fixer 設定
  ※ rector.php / .php-cs-fixer.dist.php は .php のためルート直下に置くと
    本体の Plugin\: サービス検出で 500 になる。Resource/ 配下が必須。
- .gitignore: /vendor/・composer.lock・.php-cs-fixer.cache を追加
- CLAUDE.md: 開発・テスト手順、アーキテクチャ、移行/配置の注意を記載

検証: 設定ファイル配置後も EC-CUBE 起動 OK(admin 302・ルート7件、500 なし)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
追加した静的解析ツールを実際に適用・対応した。

- rector process 適用: constructor promotion / readonly プロパティ / Elvis 演算子 /
  PHPDoc クラス名 import(TernaryToElvis / ClassPropertyAssignToConstructorPromotion / ReadOnlyProperty)
- php-cs-fixer fix 適用: 戻り値型補完・ライセンスヘッダ https 化など 11 ファイル整形
- テストクラスのプロパティを nullable 化(EccubeTestCase が tearDown で全プロパティに
  null 代入するため、非 null 型だと TypeError になる)
- phpstan-baseline.neon を追加し level 6 を green に(既存の型注釈不足/doctrine 偽陽性を
  grandfather、新規コードは level 6 で検査)

検証: PHPUnit 全 24 件パス / php-cs-fixer 差分ゼロ / phpstan [OK] No errors

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
EC-CUBE 4.4 (Symfony 7.4) の symfony/cache が ext-redis <6.1 と衝突を宣言する一方、
CI ランナー(nanasess/setup-php) には古い php-redis 5.3.7 が apt で入るため本体の
composer install が失敗していた。本プラグイン・本体テストは redis を使用しないため
--ignore-platform-req=ext-redis で回避する。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
有効化したプラグインのルーティングはコンテナのコンパイル時に dtb_plugin から確定する。
phpunit プロセスでの遅延コンパイルに委ねると DB/タイミングにより有効プラグイン一覧を
取りこぼし、RouteNotFoundException で断続的に失敗していた(特に pgsql)。

- Run PHPUnit: cache:clear 後に cache:warmup を実行し、クリーンなプロセスで
  プラグイン込みのコンテナを確定的にビルドしてから phpunit を実行
- Setup Plugin: enable 後に cache:clear する順序へ(api4 #186 に合わせる)

検証: ローカル(EC-CUBE 4.4/test)で warmup 後にルート7件登録・phpunit 24件パス

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
baseline で grandfather していた 74 件の指摘を実際に解消し、phpstan-baseline.neon を撤廃。

- Repository に @extends AbstractRepository<RecommendProduct> を付与し、find()/findOneBy()/
  QueryBuilder の戻り値型を確定(method.notFound 7・doctrine.dql 5・argument.type を解消)
- 配列型に値型を明示(array<string, mixed> / RecommendProduct[] / int[] 等)
- Service の $data を RecommendProduct 型に、PluginManager の @param を整理(null/不明引数除去)
- Entity の visible を NOT NULL カラムに合わせ bool 型へ(doctrine.columnType 解消)
- テストメソッドに : void、ヘルパ引数に型、プロパティに @var を付与
  (EccubeTestCase の tearDown 対策で native 型化はせず @var + 無型に統一)
- php-cs-fixer: phpdoc_to_property_type を無効化(テストプロパティの非null native 型化を防ぐ)
- phpstan.neon.dist: includes(baseline) を削除

検証: phpstan No errors / php-cs-fixer 差分ゼロ / phpunit 24件パス(EC-CUBE 4.4・PHP 8.2)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
release.yml の packaging で、本番配布物に不要な開発用ファイルを削除してから tar 化する。

- docker-compose*.yml / dockerbuild/(Docker テスト環境)
- CLAUDE.md / phpstan.neon.dist / Resource/rector.php / Resource/.php-cs-fixer.dist.php(開発ツール)

検証: 上記除外後も PharData 展開 OK・composer code=Recommend44 を確認(インストール可能)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
DB 種別に依存しない静的解析を、テストマトリクスとは別の static-analysis ジョブで
SQLite・PHP 8.3 の1構成・3ツール直列で実行する(重複実行を避けつつ Checks を分離)。

- php-cs-fixer --dry-run --diff / rector process --dry-run(差分で失敗)
- phpstan analyse(level 6)。phpstan は objectManagerLoader がカーネルを起動し
  EccubeExtension が dtb_plugin を読むため、本体インストール+DB+プラグイン有効化を前提とする

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- static-analysis: Setup EC-CUBE に eccube:fixtures:load を追加。プラグイン有効化時に
  PluginManager::createDataBlock() が DeviceType マスタを参照するため、未投入だと
  newBlock(null) で enable が TypeError になり失敗していた
- static-analysis / テストマトリクスの対象 PHP に 8.5 を追加(サポート範囲 8.2-8.5 の上端)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
コンストラクタでのみ代入される typed プロパティのため readonly が適切。
rector の ReadOnlyPropertyRector が検出する差分(過去の rector→php-cs-fixer の
適用順で型付与後に readonly 化されず残っていた)を解消し、CI の rector --dry-run を green にする。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
eccube:plugin:enable 直後の 1 回の cache:clear では、プラグインのルーティング
(おすすめ管理ページ plugin_recommend_list)と Nav メニューが確定せず、
docker compose up 直後の初回ロードで /admin/plugin/recommend が 404 になっていた。
enable とは別パスで cache:clear をもう一度実行すると確定するため、
docker-compose.dev.yml の entrypoint で cache:clear を 2 回流すようにした。

curl で docker compose up 直後(手動キャッシュ操作なし)から
/admin/plugin/recommend が 200・おすすめ管理ページ表示・Navメニュー表示に
なることを確認済み。CLAUDE.md にも挙動と対処を記載。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.

1 participant