EC-CUBE Advent Calendar 2020 9日目の記事です。
Strategyパターンを使ってEC-CUBE4で会員ランクを管理するプラグインのサンプルを作ってみました。
Strategyパターンは以下のような感じです。Strategyインターフェースを作って大枠の仕様を策定し、ContextクラスでStrategyインターフェースを実装したクラスを呼び出すといった流れになります。
今回、会員の合計購入金額でランクを振り分ける処理をStrategyパターンを使って実装してみようと思います。
会員ランクを管理するエンティティを作成
シルバー会員やゴールド会員など、会員ランクを管理するエンティティを作成します。
会員ランクを管理するエンティティのリポジトリを作成
会員ランクを管理するエンティティのリポジトリを作成します。
会員ランクを決定するStrategyインターフェースを作成
会員ランクを決定するStrategyインターフェースを作成します。
レギュラー会員、シルバー会員、ゴールド会員の3種類の会員ランクを作成
レギュラー会員、シルバー会員、ゴールド会員を上記で作成したStrategyインターフェースで実装します。
共通処理を毎回実装するのは面倒くさいので、各会員を実装する前に共通処理を管理する継承クラスを作成します。
以下のようにレギュラー会員を実装します。
以下のようにシルバー会員を実装します。
以下のようにゴールド会員を実装します。
会員ランクを取得するコンテキストを作成
会員の会員ランクを取得するコンテキストを作成します。
コンパイラパスで自動タグ付けされたクラスをCustomerTypeContextに追加
コンパイラパスでeccube.customer.typeがタグ付けされた会員タイプクラスをCustomerTypeContextに追加します。
エクステンションで会員タイプのStrategyインターフェースが実装されたクラスにタグ付け
エクステンションで会員タイプのStrategyインターフェースが実装されたクラスにeccube.customer.typeをタグ付けします。
会員タイプのStrategyインターフェースが実装されたクラスがここで自動でタグ付けされるので、会員タイプのStrategyインターフェースを実装したクラスを作れば何個でも会員ランクを追加できます。
コンパイラパスとエクステンションを登録
EC-CUBE4.0.5からプラグインでSymfony Bundleが利用できるようになったので、バンドルを作成して上記で作成したCustomerTypeCompilerPassとCustomerTypeExtensionを登録します。
バンドルを登録
上記で作成したCustomerTypeBundleをSymfonyに登録します。
以上で完成です。
あ、あとplg_customer_typeテーブルに会員ランク情報を登録する必要があります。
リポジトリのPluginManger.phpを参考にしてください。
コントローラーで会員ランク名を取得
会員ランクを取得する準備ができたのでコントローラーで会員ランクを取得してみます。
作成したページにログインしてアクセスすると、購入合計金額に応じで会員ランク名が表示されると思います。
詳しくはGithubのリポジトリで
会員ランク情報をデータベースに保存する処理など、一部説明を端折っているのでGithubのリポジトリをクローンして実際の動作を確認してください!