Логика работы корзины

Пишу добавление в корзину интернет магазина. На сайте есть авторизация. Подскажите, пожалуйста, как лучше простроить логику.

Я написал корзину следующим образом: Если пользователь не авторизован товары добавляются в сессию, если же авторизованный то в БД, верно ли это?

Делаю проект на Yii2. Контроллеры получаются слишком огромные.

Процентов на 90 уверен, что я делаю что-то не так, потому что четкого понимания построения кода нет Контроллер корзины, action добавления в корзину:

public function actionAdd($id, $measure_id = null, $qty = 1)
    {

        $product = Product::findOne($id);
        if (empty($product)) {
            return false;
        }
        $measure = Measure::findOne($measure_id);

        if (Yii::$app->user->isGuest) {
            $session = \Yii::$app->session;
            $session->open();

            $cart = new CartSession();
            $cart->addToCart($product, $measure, $qty);

            if (\Yii::$app->request->isAjax) {
                return $this->renderPartial('cart-modal', compact('session'));
            }
        } else {
            $user = Yii::$app->user->identity;

            if (isset($measure)) {
                $cartItem = Cart::find()
                    ->where([
                        'product_id' => $product->id,
                        'measure_id' => $measure->id
                    ])
                    ->one();
            } else {
                $cartItem = Cart::find()
                    ->where([
                        'product_id' => $product->id,
                    ])
                    ->one();
            }

            if (is_null($cartItem)) {
                $cart = new Cart();
                $cart->addToCartBase($user->id, $product, $measure, $qty);
                if (\Yii::$app->request->isAjax && $cart->save()) {
                    $cart = Cart::find()
                        ->where(['user_id' => $user->id])
                        ->all();
                    return $this->renderPartial('cart-modal', compact('cart'));
                }
            } else {
                if (isset($measure)){
                    $cartItem->price += $measure->price * $qty;
                }else{
                    $cartItem->price += $cartItem->price * $qty;
                }

                $cartItem->qty += $qty;
                if (\Yii::$app->request->isAjax && $cartItem->save()) {
                    $cart = Cart::find()
                        ->where(['user_id' => $user->id])
                        ->all();
                    return $this->renderPartial('cart-modal', compact('cart'));
                }
            }
        }

        return $this->redirect(\Yii::$app->request->referrer);

    }

По задумке, у меня 2 типа товаров: 1 - это без грамовки 2 - с граммовкой, в карточке есть возможность выбор - 25 гр., 50 гр. и тд. Для реализации этого я сделал отдельную таблицу и связал её с таблицей товара


Ответы (1 шт):

Автор решения: Коля Воробьев

Верно, только проверку авторизован ли пользователь лучше выносить в отдельный класс и в контроллере уже вызывать метод. С Yii2 не работал, в ларавел для этого уже есть все готовое, называется middelware. Опять же сделать класс корзины и там уже писать логику, в контроллере только вызывать методы.

→ Ссылка