エンジニ屋.com(エンジニヤドットコム)

分かりやすくを意識して情報発信!

【カスタマイズ】カートに進む際にログイン必須化【Eccube4】

「カートへ進む」をクリックした際にログインチェック。ログイン後は、再度カートに移行。


デフォルトの設定では、「レジに進む」をクリックした際、ログイン画面に移行します。(未ログイン時)

実装

先ず初めにカートへ進むをクリックした際に通るControllerを確認します。
確認すると、src/Eccube/Contorller/CartController.phpのindexメソッドで実行されています。 その中にログイン状態をチェックするコードを書いていきます。

その前にカスタマイズする場合は、Customizeのディレクトリ内にファイルを作成する必要があるので、app/Customize/Controller/CartController.phpを作成してEccubeディレクトリのCartController.phpをコピーします。

74行目あたりのindexメソッドに下記のように追記していきます。

// 74:
    /**
     * カート画面.
     *
     * @Route("/cart", name="cart")
     * @Template("Cart/index.twig")
     */
    public function index(Request $request)
    {
        // ログイン状態チェック
        if( ! $this->isGranted('ROLE_USER') ){
            // ログイン後のリダイレクト先をカートに
            $this->setLoginTargetPath('cart');
            return $this->redirectToRoute('mypage_login');
        }


実は、今回の実現したいことはこれだけで完了です。
ログインしていない状態で、カートへ進むをクリックするとログイン画面へ移行して、ログイン後にカート画面へ戻ります。

ソースコードの詳しい解説していきます。
83行目にisGranted('ROLE_USER')でログイン状態がチェックできます。こちらは、symfonyで用意されているメソッドで、ControllerTrait というファイルの中で作成されています。このControllerTraitがOrderHelperで利用されています。そしてCartControler.phpの中でuseでインポートされているので、isGranted が使用できるという流れです。 これで、ユーザーの権限を判定してくれます。
if条件の頭に!を付けているので、もしログインされていなかったらtrueとなり、if文の中を通ります。
85行目でログイン後にcartの画面に移行するように、setLoginTargetPath() メソッドを使用しています。こちらはAbstaractController.phpで作成されています。引数に遷移先のRouteのnameを入れることで、session内に値を保存しています。Eccbueのデフォルトでログイン時にsession内の値を確認するので、カートの画面に戻るという流れです。
86行目では、書いてある通りにマイページのログイン画面にリダイレクトをかけています。

以上となります!
isGranted()とsetLoginPath()便利ですね。 もし他の用途で必要箇所があれば、応用が利くと思います。

Have a good development day~~!