カスタマイズの中で「ポイントプラグインが有効なときだけ処理を追加したい」といった分岐が必要になることがあります。プラグインが無効な状態でそのプラグインのクラスを参照するとエラーになるため、事前の確認が要ります。EC-CUBE4での書き方と、3系との違いをまとめます。
EC-CUBE4はPluginRepositoryで確認する
4系では PluginRepository をコンストラクタで受け取り、findByCode() でプラグインを検索します。
use Eccube\Repository\PluginRepository;
class SampleService
{
/**
* @var PluginRepository
*/
private $pluginRepository;
public function __construct(PluginRepository $pluginRepository)
{
$this->pluginRepository = $pluginRepository;
}
private function isPluginEnabled($code)
{
$Plugin = $this->pluginRepository->findByCode($code);
// インストールされていない場合は null が返る
if (null === $Plugin) {
return false;
}
return $Plugin->isEnabled();
}
}
判定は2段階です。
- インストールされているか —
findByCode()がnullを返さないか - 有効になっているか —
isEnabled()がtrueか
インストール済みでも管理画面で無効化されている状態があるため、両方を確認しないと不十分です。無効なプラグインのサービスを呼び出すとエラーになります。
プラグインコードは大文字小文字を気にしなくてよい
findByCode() は内部で検索値とデータベースの値を小文字に揃えてから比較します。'Point' と 'point' のどちらを渡しても同じ結果になります。
プラグインコードは app/Plugin 配下のディレクトリ名と一致します。実際に導入されているコードは、管理画面のオーナーズストア>プラグイン一覧か、app/Plugin の中身で確認できます。
Twigテンプレートで分岐したい場合
テンプレート側で表示を切り替えたい場合は、コントローラで判定した結果を渡すのが確実です。
return [
'is_point_enabled' => $this->isPluginEnabled('Point'),
];
テンプレートからリポジトリを直接呼ぶ書き方もできますが、表示の都合でデータベースへ問い合わせることになるため、コントローラ側で解決しておくほうが見通しがよくなります。
EC-CUBE3の場合
3系はDIコンテナにPimpleを使っており、書き方が根本的に異なります。$this->app 経由でリポジトリを取得します。
$Plugin = $this->app['eccube.repository.plugin']->findOneBy(
[
'code' => 'Point',
'del_flg' => Constant::DISABLED,
]
);
3系には del_flg という削除フラグのカラムがあり、これを条件に含める必要があります。4系では del_flg が廃止されているため、この条件は不要です。
有効かどうかの判定も、3系では $Plugin->getEnable() のようにプロパティを直接見る形でした。4系の isEnabled() に相当します。
そもそも依存させない設計を検討する
特定のプラグインの有無で分岐する処理は、そのプラグインがバージョンアップで仕様変更されたときに影響を受けます。プラグインが提供するフックやイベントで拡張できないかを先に確認してください。
判定を入れる場合も、プラグインのクラスを直接 use しないことが重要です。無効時やアンインストール時にクラスが存在せず、判定にたどり着く前にエラーになります。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。