会員グループ管理プラグインの EC-CUBE 4.4 対応版をつくっています。4.4 用のブランチを切って、テストが通るところまでは来ました。配布はまだ先です。
区切りがいいので、このプラグインで何ができるのかと、4.4 対応で何を書き換えたのかをまとめておきます。
できること
会員をグループに分けて、グループごとに何を見せるか決めるプラグインです。卸売会員だけに卸価格の商品を見せる、法人向けの説明ページを取引先にだけ公開する、といった使い方を想定しています。
| 機能 | 内容 |
|---|---|
| 会員グループ管理 | 会員を複数のグループに分類する |
| 商品のアクセス制限 | 割り当てたグループの会員だけが閲覧・購入できる |
| カテゴリのアクセス制限 | 割り当てたグループの会員だけが閲覧できる |
| ページのアクセス制限 | 割り当てたグループの会員だけが閲覧できる |
| 非会員への表示制御 | グループごとに、未ログインユーザーへ商品を見せるか決める |
| CSV 登録 | 会員や商品へのグループ割り当てを一括で登録・解除する |
判定のルール
商品やカテゴリ、ページに対して「このグループの会員なら見られる」という割り当てをします。覚えることは2つだけです。
- 会員グループを割り当てていないものは、誰でも見られる
- 複数のグループを割り当てた場合は OR 判定。どれかに所属していれば見られる
1つめが地味に効きます。既存の商品には一切手を入れずに、限定商品だけを後から足せる。逆に「すべてのグループに所属している会員だけ許可」のような AND 条件は指定できません。
未ログインのユーザーだけ扱いが別で、グループ編集画面の「未ログインユーザーは商品を表示」を有効にすると、そのグループに割り当てた商品は未ログインでも一覧や詳細に出ます。見えるけれど買えるのは会員だけ、という売り方をしたいとき用です。
隠すだけでは足りない
商品一覧から消しただけでは守れません。URL を直打ちされたら詳細ページには着いてしまいます。なので判定は表示と購入の両方に入れてあります。
| 層 | 役割 |
|---|---|
Service\Gate\* | 閲覧可否そのものの判定 |
Security\Authorization\Voter\* | Symfony の認可機構への接続 |
Repository\QueryCustomizer\* | 一覧の検索クエリから対象外を除外 |
Service\PurchaseFlow\Validator\GroupValidator | カートと購入時の検証 |
一覧から除外するのはあくまで見た目の話で、実際に止めているのは Voter と購入フローの Validator です。
CSV での一括割り当て
会員と商品については、グループの割り当てを CSV でまとめて登録できます。取込画面には「雛形ファイルダウンロード」(ヘッダー行だけ)と「現在の設定をダウンロード」(実データ)の2つのボタンがあり、後者で落とした CSV は編集してそのまま再アップロードできます。削除フラグの列に D を入れると割り当てを解除します。
出力されるのは会員グループが割り当たっている会員と商品だけです。どのグループにも属していない会員は行として出てきません。会員グループ ID が空の行は取り込めないためで、全会員のリストが出ると思って使うと戸惑うところだと思います。
カテゴリとページの割り当てには CSV 取込がありません。管理画面から設定してください。
アドオン
本プラグインを土台にして、次のアドオンを追加できます。
| アドオン | 内容 |
|---|---|
| 会員グループ価格管理 | グループごとの価格や卸売価格、割引率、ボリュームディスカウント |
| 配送方法管理 | グループごとに選べる配送方法を出し分け |
| 支払い方法管理 | グループごとに選べる支払い方法を出し分け |
| 会員登録拡張 | 会員登録時にグループを割り当て |
| 会員登録承認制 | 登録を管理者の承認制にする |
| 会員ランク管理 | 購入実績に応じてグループを自動割り当て |
価格や送料の出し分けでは、会員グループ一覧の並び順が優先度になります。会員が複数のグループに所属していると、上から見ていって最初に見つかった設定が適用されます。ドラッグアンドドロップで並べ替えられるので、意図しない価格が出るときはまず並び順を疑ってください。
EC-CUBE 4.4 対応で書き換えたところ
4.4 は 4.2 / 4.3 とは別物でした。土台の依存が丸ごと入れ替わっています。
| 依存 | 4.2 / 4.3 | 4.4 |
|---|---|---|
| PHP | 7.4 〜 8.3 | ^8.2 |
| Symfony | 6.4 | ^7.4 |
| doctrine/orm | 2.18 | ^3.0 |
| doctrine/dbal | 3.8 | ^4.4 |
同じコードで両方を面倒みるのは諦めて、4.4 専用のブランチに分けました。プラグインコードは CustomerGroup44、パッケージ名は ec-cube/customergroup44 です。EC-CUBE から見ると 4.2 / 4.3 版とは別のプラグインになります。
書き換えた内容はこのあたりです。
- Doctrine のアノテーション(
@ORM)を PHP の属性記法へ変換。EC-CUBE 独自の@EntityExtensionと@ShoppingFlowもEccube\Attribute配下の属性に置き換え - Symfony 7 で削除された
Symfony\Component\Security\Core\SecurityをSymfony\Bundle\SecurityBundle\Securityに差し替え - 開発が終了した SensioFrameworkExtraBundle への依存を削除。
@TemplateはSymfony\Bridge\Twig\Attribute\Template、@IsGrantedはSymfony\Component\Security\Http\Attribute\IsGrantedへ - Doctrine ORM 3 で削除された API の使用をやめる
いちばん手間だったのはテストでした。EC-CUBE 本体のテストクラスが final になったので、それを継承して使い回していたテストが軒並み動かなくなり、購入シナリオなどを Trait に切り出す形へ書き直しています。プラグイン本体のコードより、テストのほうが差分が大きくなりました。
動作要件
| 項目 | 内容 |
|---|---|
| EC-CUBE | 4.4 系 |
| PHP | 8.2 / 8.3 |
| データベース | MySQL 8、PostgreSQL 13 以上 |
CI では PHP 8.2 と 8.3、MySQL 8.4、PostgreSQL 13 と 18 の組み合わせでテストを回しています。MySQL 5.7 は 4.4 本体の検証対象から外れたので、こちらも対象外にしました。
いまの状況
2026年7月27日の時点で、PHPUnit も PHPStan も 4.4 ブランチで通っています。とはいえ EC-CUBE 4.4 本体がまだリリースされていない(開発ブランチで進行中)ので、配布はそのあとです。実店舗で動かした実績もまだありません。
4.2 / 4.3 版は引き続き更新しています。直近は 4.3.6 で、CSV の雛形ダウンロードが全データを出力していた不具合を直しました。4.4 に上げる予定がなければ、いま入れているものをそのまま使い続けて問題ありません。