Skip to content

feat: EC-CUBE 4.4 (Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2 以上) 対応#53

Merged
ttokoro20240902 merged 8 commits into
EC-CUBE:4.4from
nanasess:feature/ec-cube4.4
Jun 24, 2026
Merged

feat: EC-CUBE 4.4 (Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2 以上) 対応#53
ttokoro20240902 merged 8 commits into
EC-CUBE:4.4from
nanasess:feature/ec-cube4.4

Conversation

@nanasess

@nanasess nanasess commented Jun 24, 2026

Copy link
Copy Markdown
Contributor

概要

決済プラグイン実装サンプル (SamplePayment) を EC-CUBE 4.4 (Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2 以上) へ対応しました。
あわせて、本対応で得た手順を他の決済プラグインへ展開できるモデルケースとして整理しています。

プラグインコードは EC-CUBE のバージョンに合わせ SamplePayment42SamplePayment44、パッケージ名は ec-cube/samplepayment42ec-cube/samplepayment44 (version 3.0.0) に変更しました。

移行手順 (他の決済プラグイン向けモデルケース)

1. 動作環境を 4.4 へ

  • docker-compose.yml の image を ${TAG} でパラメータ化し、デフォルトを 8.2-apache-4.4 に。
  • 落とし穴: dev の entrypoint は起動時に eccube:plugin:enable を自動実行する。未移行コード (アノテーション/戻り型なし) は Symfony 7.4/PHP 8.2 で読めず Compile Error になりコンテナが healthy になる前に exit する。up -d --wait は移行完了後の検証ステップであり、最初には通らない。

2. 静的解析・整形ツールの導入 (Resource/ 配下に置く)

  • rector / php-cs-fixer / phpstan の設定はプラグインのルート直下に置かない。本体の Plugin\: サービス検出に巻き込まれ Plugin\<Code>\rector クラスを期待されて 500 になるため、exclude 対象の Resource/ 配下に置く。
  • 本体イメージは vendor/ を焼き込んでいないため、初回 rector は「プラグインを有効化しない一回限りコンテナ」で docker-php-entrypoint により vendor を展開してから実行する。

3. rector による自動変換 (アノテーション → アトリビュート)

  • @Route#[Route]@ORM\*#[ORM\*] + 型付きプロパティ、constructor promotion が自動変換される。

4. rector で変換しきれない手動対応 (山場)

  • @EntityExtension#[EntityExtension(...)] (本体の名前空間・記法変更, rector 非対象)。
  • @Template#[Template(...)] (Symfony\Bridge\Twig\Attribute\Template)。Sensio FrameworkExtraBundle が 4.4 に無いため手動
  • Entity trait のゲッターを nullable 化 (PHP 8.2 の厳格な戻り型。未設定時 500 を防ぐ)。
  • PaymentMethodInterface の戻り型変更 (決済プラグイン特有・最重要):
    • verify(): PaymentResult|bool成功時は false を返す (成功時に PaymentResult を返すと本体で getResponse()->isRedirection() が null 呼び出しになり 500)。
    • apply(): PaymentDispatcher|bool — リダイレクト不要時は false
  • buildForm() / configureOptions() / enable() / getSubscribedEvents() 等に戻り型を追加。
  • constructor promotion で DI bind 引数名を保持 ($shoppingPurchaseFlow 等は rector が引数名をプロパティ名へ改名するため、promotion 前にプロパティ名を bind 名へ揃える)。

5. E2E テスト (Playwright) の調整

  • 4.4 ではカート追加が AJAX 化し /cart へ自動遷移しないため、AJAX 完了を待って明示的に遷移。
  • SQLite + 並列実行は競合するためローカルは --workers=1

このプラグインでの変更点

  • feat: EC-CUBE 4.4 (Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2) 対応
  • refactor!: プラグインコードを SamplePayment42SamplePayment44 へ改名 (BREAKING: パッケージ名・コード変更、要再インストール。DB スキーマは snake_case のため不変)
  • fix: テンプレートの version-less 名前空間 (Plugin\SamplePayment\...) を SamplePayment44 へ修正 (受注編集画面の Twig RuntimeError)
  • test: 受注編集画面・決済金額変更のリグレッション E2E を追加
  • ci: Playwright workflow を 4.4 / PHP 8.2-8.5 の matrix へ更新 (npm ciyarn、actions を v4 へ)
  • docs: README のコード例を Symfony 7 / 4.4 へ更新、ファイル概要の旧クラス名・リンクを修正
  • feat: 決済金額変更に bcmath (bcadd/bcsub/bcmul/bcdiv) の加減乗除サンプルを追加 (拡張が無くても nanasess/bcmath-polyfill 経由で動作)

テスト

  • rector --dry-run 差分ゼロ / php-cs-fixer 準拠
  • cache:clear 後にコンテナが healthy、[OK] Plugin Enabled.
  • PHP 8.2 / 8.5 の実イメージで起動・E2E パスを確認 (matrix の両端)
  • E2E 5 件パス (guest_convini / guest_credit_link / guest_credit_token / 受注編集 constant() 回帰 / changePrice bcmath)
  • 未移行コード (4.3) は 4.4 イメージで起動失敗することを実機で確認 (移行の必要性の裏取り)

nanasess and others added 8 commits June 24, 2026 12:12
- docker-compose.yml の image を 8.2-apache-4.4 へ更新
- rector / php-cs-fixer / phpstan 設定を Resource/ 配下に配置
- アノテーション → アトリビュート変換 (@route, @Orm\Column, @EntityExtension 等)
- constructor promotion (DI bind 引数名 $shoppingPurchaseFlow は保持)
- Entity trait のゲッターを nullable 化 (PHP 8.2 厳格戻り型対応)
- PaymentMethodInterface の戻り型変更に追従 (verify() 成功時は false)
- buildForm()/enable()/getSubscribedEvents() 等に戻り型を追加
- E2E テストをカート AJAX 化に追従
- package-lock.json を削除し yarn.lock へ統一

Co-Authored-By: Claude <noreply@anthropic.com>
EC-CUBE 4.4 対応に合わせ、プラグインの識別子をバージョンに揃える。

- PHP 名前空間 Plugin\SamplePayment42 → Plugin\SamplePayment44
- Twig 名前空間 @SamplePayment42 → @SamplePayment44
- composer パッケージ名 ec-cube/samplepayment42 → ec-cube/samplepayment44
- プラグインコード (extra.code) と docker-compose.dev.yml の require/enable を更新
- composer.json version を 2.0.0 → 3.0.0 に更新

DB スキーマ (plg_sample_payment_*, dtb_order.sample_payment_* カラム) と
翻訳キー (sample_payment.*)・ルート名は snake_case のため不変。

BREAKING CHANGE: composer パッケージ名とプラグインコードが変わるため、
app/Plugin/SamplePayment44 として再インストール・再有効化が必要。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
受注編集画面 (コンビニ決済) で以下の RuntimeError になっていた問題を修正:
  Constant "Plugin\SamplePayment\Entity\CvsPaymentStatus::COMPLETE" is undefined

原因は元コード由来の pre-existing バグで、テンプレートがバージョン番号なしの
名前空間 Plugin\SamplePayment を参照していた (本来は Plugin\SamplePayment44)。
SamplePayment42→44 改名でも番号なしは対象外のため残存していた。

- order_edit.twig: constant('Plugin\SamplePayment\Entity\CvsPaymentStatus::*') 3箇所
  (constant() のため即 RuntimeError)
- cvs.twig / cvs_confirm.twig: getMethodClass == 'Plugin\SamplePayment\Service\Method\Convenience'
  (文字列比較のため crash しないが常に false で CVS 種別選択 UI が表示されない論理バグ)
- README.md: /app/Plugin/SamplePayment・--code=SamplePayment・@SamplePayment/*.twig の stale 参照

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
直前の fix (テンプレートの version-less 名前空間バグ) の回帰防止。
order_edit.twig は受注編集画面へ自動注入され、constant() で
Plugin\SamplePayment44\Entity\CvsPaymentStatus を参照する。名前空間が
誤っていると Twig RuntimeError で受注編集画面が HTTP 500 になる。

テストはコンビニ決済の注文を作成 → 管理画面ログイン → 受注編集を開き、
HTTP 200 で描画されること・決済状況変更リンクが正しい cvs_status
(COMPLETE=3 / EXPIRED=5 / FAILURE=4) を持つことを検証する。

バグ版テンプレート (version-less 名前空間) に戻すと本テストが 500 を
検出して FAIL することを確認済み。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- push トリガーの branches を 4.2 → 4.4 へ
- 未使用の operating-system matrix 軸を削除
- 本体 docker-compose.yml と同様に image を ${TAG} でパラメータ化し、
  PHP 8.2/8.3/8.4/8.5 (-apache-4.4) を matrix でテスト
- npm ci → yarn install --frozen-lockfile (package-lock.json は gitignore 済みで
  fresh checkout の npm ci が失敗するため)、playwright install も yarn へ
- actions/checkout・upload-artifact を v3 → v4 (v3 は EOL)。
  v4 は artifact 名の一意性が必須のため tag/db ごとに命名

PHP 8.5.7 で実起動・E2E 4 passed を確認済み。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- アノテーション表記をアトリビュートへ (@Route/@EntityExtension/@FormAppend/ORM)
- getSubscribedEvents()/getNav() に戻り型 : array を追加
- TemplateEvent 抜粋を本体 4.4 の実シグネチャへ
  (addAsset/addSnippet を string/bool 型付き・戻り型 : static に、冗長な docblock 削除)
- PaymentMethodInterface の戻り型変更を明記
  - verify(): PaymentResult|bool — 成功時は false を返す
    (成功時に PaymentResult を返すと本体で 500 になる旨も追記)
  - apply(): PaymentDispatcher|bool — リダイレクト不要時は false
- DB更新手順の「ORMアノテーション」を「ORMアトリビュート」へ

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 旧クラス名を実ファイル名へ
  - Event → SamplePaymentEvent (SamplePaymentEvent.php)
  - Nav → SamplePaymentNav (SamplePaymentNav.php)
  - TwigBlock → SamplePaymentTwigBlock (SamplePaymentTwigBlock.php)
- Repository の名前空間から余分な PluginManager\ を除去
  (Plugin\SamplePayment44\PluginManager\Repository\* → Plugin\SamplePayment44\Repository\*)
- ソースリンクのブランチを 4.0 → 4.4 (リネーム後ファイルが 4.0 ブランチに存在しないため)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
OrderController::changePrice を, 浮動小数点の丸め誤差を避けて金額計算する
bcmath (bcadd/bcsub/bcmul/bcdiv) の参考実装にした。決済総額からコンビニ手数料
(乗算・除算) を求め, 手数料を加算し, キャンペーン割引を減算する例。

- bcmath 拡張が無くても本体依存の nanasess/bcmath-polyfill 経由で動作する
- 値は文字列で受け渡し, scale を明示する本体の慣習に準拠
- E2E に changePrice エンドポイントが 200 で計算結果を返すテストを追加
  (共通処理を createConviniOrder / adminLogin ヘルパーへ抽出)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@ttokoro20240902 ttokoro20240902 merged commit cd186f0 into EC-CUBE:4.4 Jun 24, 2026
12 checks passed
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