マスタデータのEntityを拡張すると、マスタデータ管理ページでテーブルを選択できなくなる問題の対策 #5401
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.
概要(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)
マイナーバージョン互換性保持のための制限事項チェックリスト
レビュワー確認項目