0
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-12-13

EC-CUBE Advent Calendar 2022」14日目の投稿です。

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

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

composere.jsonの設定を変更する

まずはプロジェクトの直下に配置されているcomposer.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を移植します。

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.phpsrc/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さんです。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1