Сессия для не авторизованных и БД для авторизованных корзина Laravel 8

У меня есть контроллер для корзины:

class BasketController extends Controller
{
    public function addCart(Request $request, $id){
      $product = Product::find($id);
      $oldCart = Session::has('cart') ? Session::get('cart') : NULL;
      $cart = new Cart($oldCart);
      $cart->add($product, $product->id);

      $request = Session::put('cart', $cart);

      Session::flash('add-product', $product->name);

      return redirect()->back();
    }

}

Для примера взял только функцию, добавляющую товар в коризну, так же это все работает через отдельный класс Cart:

public function add($item, $id){
      $storedItem = [
        'qty' => 0,
        'id' => $item->id,
        'prod_url' => $item->url,
        'code_cat' => $item->category->code,
        'url_cat' => $item->category->url,
        'name' => $item->name,
        'cost' => $item->price,
        'price' => $item->price,
        'img' => $item->cardImage->path
      ];
      if($this->items){
        if(array_key_exists($id, $this->items)){
          $storedItem = $this->items[$id];
        }
      }
        $storedItem['qty']++;
        $storedItem['cost'] = $item->price * $storedItem['qty'];
        $this->items[$id] = $storedItem;
        $this->totalQty++;
        $this->totalPrice += $item->price;
    }

Тоже для примера взял только добавление.

Пока это все работает на сессиях. Опыта в Laravel не много, как лучше сделать следующий механизм: Если пользователь не авторизован, то сохранять товары корзины в сессии, если же авторизован, то в БД? Куда писать логику добавления в БД? Здесь же? Куда присать проверки типа: if(Auth::check()) то брать код для БД, else , код для сессии?

Заранее спасибо!


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

Автор решения: Alexandr Revnuk

Опишу на примере. Допустим у нас будет контроллер CartController Там у нас будет два методы добавления. Один будет для бд второй - сессии.

Для бд:

public function addToCartDB($product, $qty, Cart $cart)
{
   $cart->product_id = $product->id;
   $cart->qty =$qty;
   ///и тут дальше...
   $cart->save();
}

Для сессии так же

public function addToCartSession($product, $qty)
{
   $cart = Session::get('cart');
    $cart[$product->id] = array(
        "name" => $product->name,
        "qty" => $qty,
    );

    Session::put('cart', $cart);
    Session::flash('success','Сохранено');
}

Ну и так дальше... думаю логику можно уловить?

Хотя я больше люблю через сессии всегда.

→ Ссылка