ec-cube
ec-cube copied to clipboard
マスタデータのEntityを拡張すると、マスタデータ管理ページでテーブルを選択できなくなる
概要(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/までを除去するようにする。