ec-cube icon indicating copy to clipboard operation
ec-cube copied to clipboard

マスタデータのEntityを拡張すると、マスタデータ管理ページでテーブルを選択できなくなる問題の対策

Open kztomita opened this issue 2 years ago • 3 comments

概要(Overview・Refs Issue)

#5400 の修正

方針(Policy)

Proxyファイルのパスを生成する際、basename($sourceFile)ではなく、 $entityClass = substr($sourceFile, strlen($projectDir . '/src/Eccube/Entity/')); として$sourceFileから先頭の/var/www/ec-cube/src/Eccube/Entity/を除去するように 変更しました。

実装に関する補足(Appendix)

(1) basename()からsubstrに()よる部分的なパスの除去に変更になっていますが、 入力値である$sourceFileはRecursiveDirectoryIteratorにより生成されるデータであるため、directory traversalの問題は発生しないと考えます。

(2) 従来のコードではあらゆるファイルに対してProxyファイルのパスを生成して、 Proxyファイルの有無をチェックしていましたが、

$entityPath = $projectDir . '/src/Eccube/Entity/'; if (strpos($sourceFile, $entityPath) === 0) { }

のようにしてEntity配下のクラスについてのみProxyファイルのパスを生成して、 Proxyファイルの有無チェックが動作するように変更しています。

探索対象である$this->pathsは外部から指定できるので、 将来、['/var/www/ec-cube/src/Eccube/']のようにEntity以外のクラスも含むパスを 指定して呼び出された場合にも正しく動作させるためです。

テスト(Test)

(1) プラグインから Plugin/[Plugin code]/Entity/Master/DeviceTypeTrait.php のようにしてマスタデータのEntityを拡張し、 \Eccube\Doctrine\ORM\Mapping\Driver\AnnotationDriver::getAllClassNames() が返すクラス一覧に'Eccube\Entity\Master\DeviceType'が含まれるようになった ことを確認。

(2) 管理画面のマスタデータ管理のプルダウンにmtb_device_typeが表示されるようになったことを確認。

相談(Discussion)

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

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

レビュワー確認項目

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

kztomita avatar Jun 20 '22 06:06 kztomita

Codecov Report

Merging #5401 (53fd424) into 4.1 (6c466ad) will increase coverage by 0.01%. The diff coverage is 100.00%.

@@             Coverage Diff              @@
##                4.1    #5401      +/-   ##
============================================
+ Coverage     68.58%   68.59%   +0.01%     
- Complexity     6162     6164       +2     
============================================
  Files           463      463              
  Lines         25306    25310       +4     
============================================
+ Hits          17356    17362       +6     
+ Misses         7950     7948       -2     
Flag Coverage Δ
E2E 57.95% <100.00%> (+<0.01%) :arrow_up:
Unit 76.15% <100.00%> (+0.01%) :arrow_up:

Flags with carried forward coverage won't be shown. Click here to find out more.

Impacted Files Coverage Δ
...e/Doctrine/ORM/Mapping/Driver/AnnotationDriver.php 76.47% <100.00%> (+2.00%) :arrow_up:
...be/Service/PurchaseFlow/Processor/TaxProcessor.php 73.77% <0.00%> (+3.27%) :arrow_up:

Continue to review full report at Codecov.

Legend - Click here to learn more Δ = absolute <relative> (impact), ø = not affected, ? = missing data Powered by Codecov. Last update 6c466ad...53fd424. Read the comment docs.

codecov-commenter avatar Jun 20 '22 07:06 codecov-commenter

当方でユニットテストを作成し、動作確認してみます

nanasess avatar Apr 02 '24 12:04 nanasess

以下のE2Eテストを追加して検証しています。 https://github.com/nanasess/ec-cube/commit/4f7b5226b3a5228db11b80221342b3f4bc59c92a

本修正により、 Eccube\Entity\Master 配下の Entity に対して Schema Update が自動実行されないようです。 (手動で bin/console doctrine:schema:update --force を実行すれば、正常動作することは確認済み) https://github.com/nanasess/ec-cube/actions/runs/8532978876/job/23374978428#step:13:72

nanasess avatar Apr 03 '24 05:04 nanasess