概要
#6939 で composer.json の残骸整理と暗黙依存の明示化を行いましたが、影響範囲の判断が必要なため意図的に保留した項目があります。まとめて Issue 化します。
いずれも #6939 の調査で判明したもので、根拠となる実測を併記します。
1. guzzlehttp/guzzle が require にあるが本体は未使用
事実
本体は 一度も Guzzle を直接使ったことがありません (git log -S'GuzzleHttp' -- src app の結果が空)
リポジトリ全体で guzzlehttp の参照は composer.json の 1 行のみ
lock 上の依存元は codeception/module-phpbrowser(dev)、captbaritone/mailcatcher-codeception-module(dev)、monolog/monolog(require-dev/suggest)
論点
require から外すと dev には codeception 経由で残り、本番 vendor からのみ消えます。ただし Guzzle を自前で宣言していないプラグインが壊れます 。EC-CUBE のプラグインは Guzzle を使うものが多く、コアの vendor に暗黙に依存している可能性があります。
選択肢
(a) 保留(現状維持)
(b) require から削除。4.4 はメジャー更新のため破壊的変更として実施可能。プラグイン側に自前 require を促す必要あり
(c) require-dev へ移動(実質 (b) と同じだが意図が明確)
事実上「コアが提供する公開依存」として扱われてきた経緯があるかどうかが判断材料になりそうです。
2. PHP 拡張の宣言漏れ(ext-pdo / ext-session / ext-phar / ext-fileinfo)
事実
本体が使用しているのに composer.json に無く、推移的にも一切担保されていない 拡張があります。
拡張
本体での使用
現在の要求元
ext-pdo
TransactionListener:95,118、PluginService:634,800 が $nativeConnection->inTransaction() を PDO 前提で呼ぶ
なし (doctrine/dbal も要求しない)
ext-phar
PluginService:411、TemplateController:126,249 の new \PharData(...)
本番ではなし (dev の phar-io/manifest のみ)
ext-session
framework.yaml の handler_id: session.handler.native_file
なし
ext-fileinfo
UploadedFile::getMimeType() が symfony/mime 経由で finfo を使用
なし
なぜ #6939 で追加しなかったか
require に書くと、その拡張がない環境で composer が解決不能になり導入できなくなります 。実測:
$ composer update --dry-run # config.platform で ext-fileinfo を無効化して再現
Your requirements could not be resolved to an installable set of packages.
- Root composer.json requires PHP extension ext-fileinfo * but the ext-fileinfo package is disabled
exit=2
ext-pdo / ext-session は「無ければ EC-CUBE が起動しない」ため実質リスクゼロと考えられますが、ext-fileinfo / ext-phar は本体は動くが一部機能が動かない ため、これまで動いていた環境を弾く可能性があります。
参考 : ext-bcmath は nanasess/bcmath-polyfill が provide: {"ext-bcmath": "8.1.0"} を宣言しているため、bcmath 非搭載環境でも require に追加して解決が通ります (composer update --dry-run で exit=0 を実測)。制約は "*" にする必要があります(^8.2 等では polyfill の 8.1.0 が満たせません)。同様に ext-ctype は symfony/polyfill-ctype が provide します。
3. システム要件が「要件ドキュメント / InstallController / composer.json」で三者不一致
事実
拡張
要件ドキュメント
InstallController
composer.json
本体コードでの使用
sodium
必須
必須 ($requiredModules)
config.platform で緩和 (#6827 )
0 件
GD
必須
記載なし
記載なし
0 件
bcmath
記載なし
記載なし
記載なし(polyfill を require)
金額計算の中核
論点
sodium : 共有レンタルサーバー (sodium 拡張なし / CLI 不可) で API プラグインを導入できるよう composer.json に config.platform.ext-sodium を追加する #6827 で「sodium 非搭載の共有レンタルサーバーでも Web API プラグインを導入可能に」する方針が取られ、config.platform で緩和されました。しかし InstallController.php:83 の $requiredModules には 'sodium' が残り、インストーラが addDanger() で必須エラー表示を出します(※ checkModules() は表示のみでインストールをブロックしないことは確認済み)。方針と表示が矛盾しています。
GD : 要件では必須ですが、image*() / GdImage / getimagesize の使用は 0 件 です。Dockerfile では入れています。要件が実態と合っていない可能性があります。
bcmath : 金額計算(Order.php、PurchaseFlow.php 等)の中核で全面的に使用しているのに、要件にもインストーラにも記載がありません。polyfill があるため動作はしますが、要件として明示すべきではないでしょうか。
4.4 の要件自体が未記載 (ドキュメントは 4.3 まで)
対応候補
doc4.ec-cube.net の要件更新(4.4 追記、sodium/GD の見直し、bcmath 追記)※別リポジトリ
InstallController の $requiredModules / $recommendedModules の整合(sodium を推奨へ移す等)
4. doctrine/common が ClassUtils 1 箇所のためだけの依存
事実
doctrine/common を lock 上で require しているのは root のみ (ORM 3 は要求しません)
本体での唯一の使用箇所は src/Eccube/Service/CsvExportService.php:211 の ClassUtils::getClass($entity) のみ(Doctrine\Common\Collections は doctrine/collections 由来のため別)
対応候補
$em->getClassMetadata(get_class($entity))->getName() 等への置換で依存を 1 つ減らせます。実装変更を伴うため要検討。
5. 直接依存のメジャーバージョン遅れ
composer outdated --direct の結果から:
パッケージ
現在
最新
備考
mobiledetect/mobiledetectlib
2.8.45
4.11.0
2 メジャー遅れ。MobileTemplatePathListener と services.yaml:216 で使用
psr/log
2.0.0
3.0.2
制約が ~2.0 固定で 2.x のみ許容。Symfony 7.4 / monolog 3 は ^3 も許容。3.0 は型宣言が入るため BC 影響あり
doctrine/persistence
3.4.3
4.2.0
AbstractEntity、AddCartType で使用
doctrine/data-fixtures
1.8.2
2.2.1
doctrine/doctrine-fixtures-bundle
3.7.3
4.3.1
softcreatr/jsonpath
0.8.3
0.10.0
codeception/module-phpbrowser
3.0.2
4.0.0
dev
4.4 はメジャー更新のため、破壊的変更を伴う更新を実施できる節目です。それぞれ影響範囲が異なるため、個別 PR での対応が現実的と思われます。
参考: #6939 で対応済みの項目
conflict.easycorp/easy-log-handler / skorp/detect-incompatible-samesite-useragents / allow-plugins.kylekatarnls/update-helper / minimum-stability: RC / extra の死んだ 5 キー / symfony.lock の孤児レシピ 13 件の削除
phpseclib/phpseclib / justinrainbow/json-schema / ezyang/htmlpurifier の明示化
ext-filter / ext-tokenizer / ext-xml / ext-zlib の追加
🤖 Generated with Claude Code
概要
#6939 で
composer.jsonの残骸整理と暗黙依存の明示化を行いましたが、影響範囲の判断が必要なため意図的に保留した項目があります。まとめて Issue 化します。いずれも #6939 の調査で判明したもので、根拠となる実測を併記します。
1.
guzzlehttp/guzzleがrequireにあるが本体は未使用事実
git log -S'GuzzleHttp' -- src appの結果が空)guzzlehttpの参照はcomposer.jsonの 1 行のみcodeception/module-phpbrowser(dev)、captbaritone/mailcatcher-codeception-module(dev)、monolog/monolog(require-dev/suggest)論点
requireから外すと dev には codeception 経由で残り、本番 vendor からのみ消えます。ただし Guzzle を自前で宣言していないプラグインが壊れます。EC-CUBE のプラグインは Guzzle を使うものが多く、コアの vendor に暗黙に依存している可能性があります。選択肢
requireから削除。4.4 はメジャー更新のため破壊的変更として実施可能。プラグイン側に自前 require を促す必要ありrequire-devへ移動(実質 (b) と同じだが意図が明確)事実上「コアが提供する公開依存」として扱われてきた経緯があるかどうかが判断材料になりそうです。
2. PHP 拡張の宣言漏れ(
ext-pdo/ext-session/ext-phar/ext-fileinfo)事実
本体が使用しているのに
composer.jsonに無く、推移的にも一切担保されていない拡張があります。ext-pdoTransactionListener:95,118、PluginService:634,800が$nativeConnection->inTransaction()を PDO 前提で呼ぶext-pharPluginService:411、TemplateController:126,249のnew \PharData(...)phar-io/manifestのみ)ext-sessionframework.yamlのhandler_id: session.handler.native_fileext-fileinfoUploadedFile::getMimeType()が symfony/mime 経由で finfo を使用なぜ #6939 で追加しなかったか
requireに書くと、その拡張がない環境で composer が解決不能になり導入できなくなります。実測:ext-pdo/ext-sessionは「無ければ EC-CUBE が起動しない」ため実質リスクゼロと考えられますが、ext-fileinfo/ext-pharは本体は動くが一部機能が動かないため、これまで動いていた環境を弾く可能性があります。参考:
ext-bcmathはnanasess/bcmath-polyfillがprovide: {"ext-bcmath": "8.1.0"}を宣言しているため、bcmath 非搭載環境でもrequireに追加して解決が通ります(composer update --dry-runで exit=0 を実測)。制約は"*"にする必要があります(^8.2等では polyfill の 8.1.0 が満たせません)。同様にext-ctypeはsymfony/polyfill-ctypeが provide します。3. システム要件が「要件ドキュメント / InstallController / composer.json」で三者不一致
事実
InstallControllercomposer.jsonsodium$requiredModules)config.platformで緩和 (#6827)GDbcmath論点
config.platformで緩和されました。しかしInstallController.php:83の$requiredModulesには'sodium'が残り、インストーラがaddDanger()で必須エラー表示を出します(※checkModules()は表示のみでインストールをブロックしないことは確認済み)。方針と表示が矛盾しています。image*()/GdImage/getimagesizeの使用は 0 件です。Dockerfileでは入れています。要件が実態と合っていない可能性があります。Order.php、PurchaseFlow.php等)の中核で全面的に使用しているのに、要件にもインストーラにも記載がありません。polyfill があるため動作はしますが、要件として明示すべきではないでしょうか。対応候補
InstallControllerの$requiredModules/$recommendedModulesの整合(sodium を推奨へ移す等)4.
doctrine/commonがClassUtils1 箇所のためだけの依存事実
doctrine/commonを lock 上で require しているのは root のみ(ORM 3 は要求しません)src/Eccube/Service/CsvExportService.php:211のClassUtils::getClass($entity)のみ(Doctrine\Common\Collectionsはdoctrine/collections由来のため別)対応候補
$em->getClassMetadata(get_class($entity))->getName()等への置換で依存を 1 つ減らせます。実装変更を伴うため要検討。5. 直接依存のメジャーバージョン遅れ
composer outdated --directの結果から:mobiledetect/mobiledetectlibMobileTemplatePathListenerとservices.yaml:216で使用psr/log~2.0固定で 2.x のみ許容。Symfony 7.4 / monolog 3 は^3も許容。3.0 は型宣言が入るため BC 影響ありdoctrine/persistenceAbstractEntity、AddCartTypeで使用doctrine/data-fixturesdoctrine/doctrine-fixtures-bundlesoftcreatr/jsonpathcodeception/module-phpbrowser4.4 はメジャー更新のため、破壊的変更を伴う更新を実施できる節目です。それぞれ影響範囲が異なるため、個別 PR での対応が現実的と思われます。
参考: #6939 で対応済みの項目
conflict.easycorp/easy-log-handler/skorp/detect-incompatible-samesite-useragents/allow-plugins.kylekatarnls/update-helper/minimum-stability: RC/extraの死んだ 5 キー /symfony.lockの孤児レシピ 13 件の削除phpseclib/phpseclib/justinrainbow/json-schema/ezyang/htmlpurifierの明示化ext-filter/ext-tokenizer/ext-xml/ext-zlibの追加🤖 Generated with Claude Code