Executando verificação de segurança...
1

Como utilizar orientação a objetos com uma API laravel e um front em VUE JS?

Olá,

Estou criando um projeto pessoal utilizando uma API em laravel e front end em VUE JS.

Então eu criei aquele clássico carrinho utilizando oop, mas na hora de utilizar essa classe dentro da controllers eu fiquei meio perdido, toda vez que eu realizar uma requisção por um rota, sejá de exibir o carrinho, adicionar um item a ele, deletar um item, incrementar um item, eu vou ter que reidratar a classe inteira com os dados do banco de dados? visto que o carrinho do usuário não fica "salvo" na memória, apenas no banco de dados, então para eu ter meu carrinho completo nas mãos sempre vou ter que fazer o find dele e buscar item por item, adicional por adicional etc.

Passou pelo minha cabeça manter o objeto do carrinho salvo em um banco de dados redis, desta forma sempre seria fácil ter o carrinho com todos os seus atributos hidratados.

Afinal, como usar orientação a objetos nesse caso? Como implementar a orientação a objetos quando você precisa lidar com um banco de dados?

Exemplo da classe Cart:

<?php

namespace App\Cart;

use App\Discount\DiscountInterface;
use App\Models\Cart as ModelsCart;
use App\Models\Order;
use App\Product\Product;

class Cart {

    public $model;
    public $items;
    public $discount;
    public $payment;
    public $address;

    public function __construct(ModelsCart $cart)
    {
        $this->model = $cart;
        $this->items = collect([]);
    }

    public function getShippingPrice()
    {
        return 10;
    }

    public function getSubtotal()
    {
        $price = 0;

        foreach ($this->items as $item) {
            $price += $item->getPrice();
        }

        return $price;
    }

    public function getDiscount()
    {
        if ($this->discount->getType() === 'percent') {
            return ($this->discount->getValue() / 100) * $this->getSubtotal();
        } else {
            return $this->discount->getValue();
        }
    }

    public function getTotal()
    {
        return $this->getSubtotal() + $this->getShippingPrice() - $this->getDiscount();
    }

    public function addDiscount(DiscountInterface $discount)
    {
        $this->discount = $discount;
    }

    public function addAddress($address)
    {
        $this->address = $address;
    }

    public function addPayment($payment)
    {
        $this->payment = $payment;
    }

    public function addItem(CartItem $cartitem)
    {
        $this->items->push($cartitem);
    }

    public function finish()
    {
        $order = Order::query()
            ->create([
                'dwad' => 'dwads',
            ]);

        $order->payment()
            ->create([
                'dwa' => 'dwa'
            ]);
    }
}

Exemplo na controller:

  public function addItem(Request $request)
    {
        $cart = new Cart(ModelsCart::first());

        foreach ($request->products as $product) {
            $modelProduct = ModelsProduct::find($request->product->id);
            $classProduct = new Product($modelProduct);

            foreach ($product->additionals as $additional) {
                $classProduct->addAdditional($additional->id, $additional->amount);
            }

            foreach ($product->replacements as $replacement) {
                $classProduct->addReplacement($replacement->id);
            }

            $cart->addItem(new CartItem($classProduct, $product->amout));
        }

        return response()
            ->json([
                'message' => 'Item adicionado com sucesso'
            ]);
    }

Carregando publicação patrocinada...