会員グループ管理プラグインの 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.34.4
PHP7.4 〜 8.3^8.2
Symfony6.4^7.4
doctrine/orm2.18^3.0
doctrine/dbal3.8^4.4

同じコードで両方を面倒みるのは諦めて、4.4 専用のブランチに分けました。プラグインコードは CustomerGroup44、パッケージ名は ec-cube/customergroup44 です。EC-CUBE から見ると 4.2 / 4.3 版とは別のプラグインになります。

書き換えた内容はこのあたりです。

  • Doctrine のアノテーション(@ORM)を PHP の属性記法へ変換。EC-CUBE 独自の @EntityExtension@ShoppingFlowEccube\Attribute 配下の属性に置き換え
  • Symfony 7 で削除された Symfony\Component\Security\Core\SecuritySymfony\Bundle\SecurityBundle\Security に差し替え
  • 開発が終了した SensioFrameworkExtraBundle への依存を削除。@TemplateSymfony\Bridge\Twig\Attribute\Template@IsGrantedSymfony\Component\Security\Http\Attribute\IsGranted
  • Doctrine ORM 3 で削除された API の使用をやめる

いちばん手間だったのはテストでした。EC-CUBE 本体のテストクラスが final になったので、それを継承して使い回していたテストが軒並み動かなくなり、購入シナリオなどを Trait に切り出す形へ書き直しています。プラグイン本体のコードより、テストのほうが差分が大きくなりました。

動作要件

項目内容
EC-CUBE4.4 系
PHP8.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 に上げる予定がなければ、いま入れているものをそのまま使い続けて問題ありません。