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

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

Open kztomita opened this issue 2 years ago • 0 comments

概要(Overview)

プラグインでマスタデータのEntityをtraitで拡張すると、管理画面のマスタデータ管理ページの テーブルを選択するプルダウンから、拡張したEntityのテーブルが消える。

期待する内容(Expect) or 要望 (Requirement)

traitで拡張後もマスタデータ管理ページでテーブルを選択できるのが正しい動作のように思われます。

再現手順(Procedure)

以下のようにマスタデータのEntityを拡張するtraitを配置すると、マスタデータ管理ページの テーブル選択プルダウンからテーブル名が消える。

Plugin/[Plugin Code]/Entity/Master/DeviceTypeTrait.php

この例で、Entity\Master\DeviceTypeを拡張した場合は、 mtb_device_typeがプルダウンから消える。

環境 (environment)

  • EC-CUBE: 4.1.2
  • PHP: 7.4.30
  • DB:
    • MySQL 8.0.28

関連情報 (Ref)

原因については調査済み。 別途、Pull Requestを送信します。

[原因] プルダウンに表示するテーブル一覧の生成は、 \Eccube\Doctrine\ORM\Mapping\Driver\AnnotationDriver::getAllClassNames() で取得したクラス名一覧を元に行っている。

getAllClassNames()では、EntityのProxyファイルの有無をチェックしながら クラス一覧を生成しているが、Proxyファイルのパス生成時に

$proxyFile = str_replace($projectDir, $this->trait_proxies_directory, $path).'/'.basename($sourceFile);

のようにbasename()でEntityクラスファイルのパス情報を全て落としてしまっている。 このため、Entity/Master/xxxxx のようにEntity直下にないクラスについては、 Proxyファイルのパスが誤ったものとなり、Proxyファイルが存在しないものとみなされて $includedFiles[]が作成される。

$includedFiles[]の内容が誤っているので、その後の in_array($sourceFile, $includedFiles) が 該当ファイルについてfalseになりクラス名の一覧($classes[])から漏れてしまう。

結果として、プルダウンの表示からテーブル名が消えてしまうという現象が見えていた。

[対策案] Proxyファイルのパスを生成する際、basename()ではなく、 $sourceFileの/var/www/ec-cube/src/Eccube/Entity/までを除去するようにする。

kztomita avatar Jun 20 '22 06:06 kztomita