EC-CUBE4ではプラグインで専用の定数ファイルを作るのはservice.yamlやservice.ymlでできますが、
定数を分類ごとに別々のファイル名のyamlファイルを準備したいときもあるかもしれません。
また、定数を本番用と開発用で分けて更新時も残したいと考えるときもあると思います。
service.phpファイルでyamlファイルの読み込み処理を作るとそんな悩みを解消できます。
ここでは関連して以下をやってみたいと思います。
・Symfonyの仕組みを利用した定数の読み込み
・プラグイン専用のディレクトリにある定数ファイルの読み込み
・テスト用に環境別のファイルを準備する
Symfonyの仕組みを利用した定数の読み込み
ほとんどKernel.phpのconfigureContainerの内容ですので細かいところはカットします。
今回はyamlファイルが対象とします。
定数ファイルの拡張子を指定します。
$exts = '.{yaml,yml}';
ファイルを読むローダーを準備します。
$locator = new FileLocator();
$resolver = new LoaderResolver([
new YamlFileLoader($container, $locator),
new GlobFileLoader($container, $locator),
]);
プラグイン内の定数ファイルを置くディレクトリを指定します。
※ ここではResource/configに置くことにします。
$loader = new DelegatingLoader($resolver);
$loader->load(__DIR__ . '/' . '*' . $exts, 'glob');
プラグイン専用のディレクトリにある定数ファイルの読み込み
次に上記では設定ファイルを変更するとプラグインのアップデートで消えてしまうので、
PluginDataディレクトリに置き、そこのファイルを読むことにします。
※ 置き方はインストール時などにファイルをコピーすることなのでここでは取り上げないこととします。
※ 推奨されているのはプラグインコードのディレクトリに置くことです。
※ 今回のプラグインコードはCustomPluginとして書いています。
$loader = new DelegatingLoader($resolver);
$loader->load(__DIR__ . '/../../../../PluginData/CustomPlugin/' . '*' . $exts, 'glob');
プラグイン内の定数ファイルを置くディレクトリを指定します。
テスト用に環境別のファイルを準備します。
これは.envファイルの"APP_ENV"の内容別のファイルを作成して読み込ませるようにします。
$loader = new DelegatingLoader($resolver);
$environment = $container->getParameter('kernel.environment');
$loader->load(__DIR__ . '/../../../../PluginData/CustomPlugin/' . '*_' . $environment . $exts, 'glob');
ここでは例えばconfig.yamlファイルがあるとすると以下のように読めるようにしています。
config_dev.yaml
終わりに
これでservice.phpを使える状態で別途定数ファイルを持てるようになりました。
※ ここで出てくるクラスの参照先は以下の通りです。
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\DependencyInjection\Loader\GlobFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;