feat: EC-CUBE 4.4 (Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2 以上) 対応#53
Merged
Conversation
- 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
approved these changes
Jun 24, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
決済プラグイン実装サンプル (
SamplePayment) を EC-CUBE 4.4 (Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2 以上) へ対応しました。あわせて、本対応で得た手順を他の決済プラグインへ展開できるモデルケースとして整理しています。
プラグインコードは EC-CUBE のバージョンに合わせ
SamplePayment42→SamplePayment44、パッケージ名はec-cube/samplepayment42→ec-cube/samplepayment44(version 3.0.0) に変更しました。移行手順 (他の決済プラグイン向けモデルケース)
1. 動作環境を 4.4 へ
docker-compose.ymlの image を${TAG}でパラメータ化し、デフォルトを8.2-apache-4.4に。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 に無いため手動。PaymentMethodInterfaceの戻り型変更 (決済プラグイン特有・最重要):verify(): PaymentResult|bool— 成功時はfalseを返す (成功時にPaymentResultを返すと本体でgetResponse()->isRedirection()が null 呼び出しになり 500)。apply(): PaymentDispatcher|bool— リダイレクト不要時はfalse。buildForm()/configureOptions()/enable()/getSubscribedEvents()等に戻り型を追加。$shoppingPurchaseFlow等は rector が引数名をプロパティ名へ改名するため、promotion 前にプロパティ名を bind 名へ揃える)。5. E2E テスト (Playwright) の調整
/cartへ自動遷移しないため、AJAX 完了を待って明示的に遷移。--workers=1。このプラグインでの変更点
feat: EC-CUBE 4.4 (Symfony 7.4 / Doctrine ORM 3.0 / PHP 8.2) 対応refactor!: プラグインコードをSamplePayment42→SamplePayment44へ改名 (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 ci→yarn、actions を v4 へ)docs: README のコード例を Symfony 7 / 4.4 へ更新、ファイル概要の旧クラス名・リンクを修正feat: 決済金額変更に bcmath (bcadd/bcsub/bcmul/bcdiv) の加減乗除サンプルを追加 (拡張が無くてもnanasess/bcmath-polyfill経由で動作)テスト
--dry-run差分ゼロ / php-cs-fixer 準拠cache:clear後にコンテナが healthy、[OK] Plugin Enabled.guest_convini/guest_credit_link/guest_credit_token/ 受注編集 constant() 回帰 / changePrice bcmath)