ECCUBE4系の既存のMasterEntityでconst定義をできるようにしてみる

「[EC-CUBE Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ec-cube)」14日目の投稿です。

今回は既存のMasterEntityをapp配下に移動し、const定義をできるようにした時のやり方と、ハマった事を書こうと思います。

特にCsvType.phpなんかは、カスタマイズ時にidを追加してcsv出力をすることが多いと思うので、よければやってみて下さい。

# composere.jsonの設定を変更する
まずはプロジェクトの直下に配置されているcomposer.jsonに追記を行います。

```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/**"]
    },
```

```diff_json
        "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:CsvType.php
<?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さんです。