【EC-CUBE 4】独自の定数(パラメータ)を設定・管理する方法

EC-CUBE 4で、税率や送料のしきい値といった「あちこちで使う数値」を1か所にまとめる方法です。EC-CUBEのベースである Symfony の流儀にならって YAML ファイルへ書き出します。各コードブロックの右上のボタンでそのままコピーできます。

EC-CUBEで独自の定数を定義するには?

app/Customize/Resource/config/services.yaml を用意して parameters: の下に書きます。呼び出しはControllerなら $this->eccubeConfig['キー名']、Twigテンプレートなら {{ eccube_config['キー名'] }} です。

parameters:
    custom_parameter: 1000

ファイルを置いただけでは反映されません。保存後にキャッシュを削除してください。ここが一番つまずきやすいポイントです。

商品ページや コントローラー に数値を直接書き込んでいくと、あとで変更したいときに全ファイルを探して回ることになります。こうした値を1か所へ集めておくと、メンテナンス性が上がり修正漏れによるバグも防げます。

EC-CUBE自身もこの仕組みを使っており、パスワードの最小文字数や1ページあたりの商品表示数などが app/config/eccube/packages/eccube.yaml にまとまっています。

YAMLとは?

YAML(YAML Ain’t Markup Language、ヤムルまたはヤメル)は、人が読み書きしやすい形で設定値を書くためのデータ形式です。JSON と同じ用途に使われますが、記号が少なく設定ファイル向きです。

特徴内容
読みやすいインデント(半角スペース)で階層を表す。波括弧やカンマがほとんど要らない
型が自由文字列・数値・真偽値・リスト・マップを書き分けられる
入れ子にできるマップの中にリスト、リストの中にマップ、といった構造を表現できる
言語に依存しないPHP・Python・Rubyなど多くの言語で読み込める

ざっくり言えば「設定値を管理するための辞書形式のファイル」です。

インデントにタブ文字は使えません。YAMLの仕様でタブが禁止されているため、必ず半角スペースを使ってください。エディタの設定によっては見た目が同じでもタブが入るので注意が必要です。

独自の定数を設定する手順

  1. STEP1

    services.yaml を用意する

    以下の内容で services.yaml というファイルを用意し、app/Customize/Resource/config の下に置きます。

    parameters:
        custom_parameter: 1000

    キー名: 値 という形式で書きます。キー名は他の設定と衝突しないよう、独自であることが分かる名前にしておくと安全です。

    数値以外も扱えます。

    parameters:
        custom_parameter: 1000
        custom_shop_message: '本日中のご注文で翌日発送します'
        custom_free_shipping: true
        custom_campaign_tags:
            - 'summer'
            - 'sale'

    置き場所が app/Customize の下である点が重要です。app/config/eccube/packages/eccube.yaml へ追記しても動きますが、EC-CUBE本体のバージョンアップで上書きされて消える可能性があります。

  2. STEP2

    キャッシュを削除する

    設定ファイルの内容は起動のたびに読み直されるわけではなく、キャッシュ として保存されています。ファイルを置いただけでは新しい定数が認識されません。

    EC-CUBE管理画面の「コンテンツ管理」→「キャッシュ管理」からキャッシュを削除します。管理画面に入れない場合は、サーバーにSSH接続してルートディレクトリで以下のコマンドを実行します。

    bin/console cache:clear --no-warmup

    「定数を追加したのに パラメータが存在しません というエラーが出る」という場合、まずここを疑ってください。本番環境APP_ENV=prod)ではキャッシュが効いているため、削除しないかぎり反映されません。

  3. STEP3

    Controllerから呼び出す

    AbstractController を継承しているクラスであれば、以下の記述で定数を取り出せます。

    $this->eccubeConfig['custom_parameter'];

    ファイル冒頭のuse宣言を忘れないようにしてください。

    use Eccube\Controller\AbstractController;

    あとは適当な変数へ代入したり、Twigテンプレートへ渡したりして活用できます。

    public function index()
    {
        $threshold = $this->eccubeConfig['custom_parameter'];
    
        return $this->render('index.twig', [
            'threshold' => $threshold,
        ]);
    }

Controller以外のクラスから呼び出す

Serviceクラスなど AbstractController を継承しないクラスでは、EccubeConfig を自分で受け取る必要があります。以下の3つを記述してください。

use Eccube\Common\EccubeConfig;
private $eccubeConfig;
/**
 * @param EccubeConfig $eccubeConfig
 * @required
 */
public function setEccubeConfig(EccubeConfig $eccubeConfig)
{
    $this->eccubeConfig = $eccubeConfig;
}

これで、Controllerと同じように $this->eccubeConfig['custom_parameter'] で値を取り出せます。

Twigテンプレートから呼び出す

Controllerを経由せず、Twigテンプレートから直接参照することもできます。EC-CUBEは app/config/eccube/packages/twig.yamleccube_config をグローバル変数として登録しているため、どのテンプレートからでも使えます。

{{ eccube_config['custom_parameter'] }}

条件分岐に使うこともできます。

{% if Order.total >= eccube_config['custom_parameter'] %}
    <p>送料無料の対象です</p>
{% endif %}

角括弧を使った eccube_config['キー名'] の形で書いてください。EccubeConfig クラスは配列のように振る舞う実装(ArrayAccess)になっているため、この書き方が確実です。

Twigの記法そのものについては、以下の記事にまとめています。

Twig まとめ(1) ~継承やブロックについて~

開発環境と本番環境で値を変える

「テスト中は送料無料のしきい値を0円にしておきたい」というように、環境ごとに違う値を使いたい場合があります。EC-CUBEは services.yaml に加えて、環境名の付いたファイルも読み込みます。

ファイル名読み込まれるタイミング
services.yaml常に読み込まれる。共通の値を書く
services_dev.yamlAPP_ENV=dev のときだけ追加で読み込まれる
services_prod.yamlAPP_ENV=prod のときだけ追加で読み込まれる

同じキーを両方に書いた場合、あとから読み込まれる環境別ファイルの値が使われます。つまり services.yaml に既定値を書いておき、開発環境だけ services_dev.yaml で上書きする、という使い方ができます。

parameters:
    custom_parameter: 0

上記を app/Customize/Resource/config/services_dev.yaml として置けば、開発環境 のときだけしきい値が0になります。

拡張子は .yaml のほか .yml .php .xml も認識されます。特に理由がなければ .yaml で統一しておくと分かりやすいです。

定数が反映されないときの確認ポイント

設定したはずの定数が読み込まれない場合、原因はほぼ以下の4つに絞られます。

確認することよくある間違い
キャッシュを削除したかファイルを置いただけで反映されると思っている。もっとも多い原因
置き場所は合っているかapp/Customize/Resource/config ではなく app/Customize の直下などに置いている
ファイル名は合っているかservices.yaml 以外の名前にしている。読み込まれるのは services から始まる決まった名前だけ
インデントはスペースかタブ文字が混ざっている。YAMLではタブが使えない

ファイルの位置とファイル名は、EC-CUBE本体が読み込み対象を決め打ちしているため、少しでもずれていると黙って無視されます。エラーが出ないぶん気づきにくいので、まずここを見てください。

まとめ

EC-CUBEで独自の 定数 を管理する方法をまとめました。

  • app/Customize/Resource/config/services.yamlparameters: で書く
  • 保存したらキャッシュを削除する。これを忘れると反映されない
  • Controllerからは $this->eccubeConfig['キー名']
  • Twigからは {{ eccube_config['キー名'] }}
  • 環境ごとに値を変えたいときは services_dev.yaml / services_prod.yaml

ひとつ設定を移すだけでも、後々の修正がぐっと楽になります。数値を直接書き込んでいる箇所を見つけたら、少しずつ移していくのがおすすめです。

EC-CUBEのカスタマイズに関する記事

この記事に出てきた用語

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!