Логика работы корзины
Пишу добавление в корзину интернет магазина. На сайте есть авторизация. Подскажите, пожалуйста, как лучше простроить логику.
Я написал корзину следующим образом: Если пользователь не авторизован товары добавляются в сессию, если же авторизованный то в БД, верно ли это?
Делаю проект на 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. Опять же сделать класс корзины и там уже писать логику, в контроллере только вызывать методы.