「EC-CUBE Advent Calendar 2022」14日目の投稿です。
今回は既存のMasterEntityをapp配下に移動し、const定義をできるようにした時のやり方と、ハマった事を書こうと思います。
特にCsvType.phpなんかは、カスタマイズ時にidを追加してcsv出力をすることが多いと思うので、よければやってみて下さい。
composere.jsonの設定を変更する
まずはプロジェクトの直下に配置されているcomposer.jsonに追記を行います。
"autoload": {
"files": [
"src/Eccube/Resource/functions/log.php",
"src/Eccube/Resource/functions/env.php",
"src/Eccube/Resource/functions/trans.php"
],
"psr-4": {
"Eccube\\Entity\\Master\\": "app/Eccube/Entity/Master",
"Eccube\\Entity\\": "app/proxy/entity",
"Customize\\": "app/Customize",
"Eccube\\": "src/Eccube",
"Plugin\\": "app/Plugin"
},
"exclude-from-classmap": ["**/Test/**", "**/Tests/**", "**/test/**", "**/tests/**"]
},
"psr-4": {
+ "Eccube\\Entity\\Master\\": "app/Eccube/Entity/Master",
"Eccube\\Entity\\": "app/proxy/entity",
"Customize\\": "app/Customize",
"Eccube\\": "src/Eccube",
"Plugin\\": "app/Plugin"
},
上記が追記した内容になります。
MasterEntityを配置する
app/Eccube/Entity/Masterディレクトリを配置し、そこに既存のMasterEntityを移植します。
<?php
namespace Eccube\Entity\Master;
use Doctrine\ORM\Mapping as ORM;
if (!class_exists(CsvType::class, false)) {
/**
* CsvType
*
* @ORM\Table(name="mtb_csv_type")
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="discriminator_type", type="string", length=255)
* @ORM\HasLifecycleCallbacks()
* @ORM\Entity(repositoryClass="Eccube\Repository\Master\CsvTypeRepository")
* @ORM\Cache(usage="NONSTRICT_READ_WRITE")
*/
class CsvType extends \Eccube\Entity\Master\AbstractMasterEntity
{
/**
* @var integer
*/
const CSV_TYPE_PRODUCT = 1;
/**
* @var integer
*/
const CSV_TYPE_CUSTOMER = 2;
/**
* @var integer
*/
const CSV_TYPE_ORDER = 3;
/**
* @var integer
*/
const CSV_TYPE_SHIPPING = 4;
/**
* @var integer
*/
const CSV_TYPE_CATEGORY = 5;
/**
* @var integer
*/
const CSV_TYPE_CUSTOMER_QUESTION = 6;
}
}
この時に、
if (!class_exists(CsvType::class, false)) {
この条件分岐がない場合は、
app/Eccube/Entity/Master/CsvType.php
とsrc/Eccube/Entity/Master/CsvType.php
の両方に追記してあげて下さい。
composer dump-autoloadを実行する
今までに記載した対応が全て終わったら、composer dump-autoloadを実行しましょう。
doctrine cacheを clearしたり、proxyの再生成もおこなっておくと良いです。
ハマったこと
if (!class_exists(CsvType::class, false)) {
私が利用したECCUBEのバージョンでは、この条件分岐が、src配下のMasterEntity全てに記載されていませんでした。
そのため、
app/Eccube/Entity/Master/CsvType.php
には
if (!class_exists(CsvType::class, false)) {
と入れたのに、namespaceが重複しているとエラーが出るの。。。?と。。。
思い込みをせず、src配下のCsvType.phpを確認していれば、全然ハマる内容ではなかったです。
思い込みって怖いですね。
最後に
これで、既存のMasterEntityにconst追加できるようになりました。
もちろん、既存のconst定義もそのまま移植されているので、使えます。
移植していないMasterEntityだって、ちゃんと今まで通り使えるようになっているはずです!
Traitはとっても便利ですが、const定義ができないのが難点ですよね。
eccube.yamlに追加分は定義するとか、拡張用のconst定義のファイルを作るでもいいとは思いますが、どうせなら本体と書き方を統一したいですよね。
明日は@amidaikeさんです。