EC-CUBE 4で、税率や送料のしきい値といった「あちこちで使う数値」を1か所にまとめる方法です。EC-CUBEのベースである Symfony の流儀にならって YAML ファイルへ書き出します。各コードブロックの右上のボタンでそのままコピーできます。
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の仕様でタブが禁止されているため、必ず半角スペースを使ってください。エディタの設定によっては見た目が同じでもタブが入るので注意が必要です。
独自の定数を設定する手順
-
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本体のバージョンアップで上書きされて消える可能性があります。 -
STEP2
キャッシュを削除する
設定ファイルの内容は起動のたびに読み直されるわけではなく、キャッシュ として保存されています。ファイルを置いただけでは新しい定数が認識されません。
EC-CUBE管理画面の「コンテンツ管理」→「キャッシュ管理」からキャッシュを削除します。管理画面に入れない場合は、サーバーにSSH接続してルートディレクトリで以下のコマンドを実行します。
bin/console cache:clear --no-warmup「定数を追加したのに
パラメータが存在しませんというエラーが出る」という場合、まずここを疑ってください。本番環境(APP_ENV=prod)ではキャッシュが効いているため、削除しないかぎり反映されません。 -
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.yaml で eccube_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.yaml | APP_ENV=dev のときだけ追加で読み込まれる |
| services_prod.yaml | APP_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.yamlにparameters:で書く- 保存したらキャッシュを削除する。これを忘れると反映されない
- Controllerからは
$this->eccubeConfig['キー名'] - Twigからは
{{ eccube_config['キー名'] }} - 環境ごとに値を変えたいときは
services_dev.yaml/services_prod.yaml
ひとつ設定を移すだけでも、後々の修正がぐっと楽になります。数値を直接書き込んでいる箇所を見つけたら、少しずつ移していくのがおすすめです。

