Blog do MX Cursos

Criando um carrinho de compras com PHP – Parte 3

Olá pessoal,

Essa é a terceira parte do artigo/vídeo aula que ensino como criar um carrinho de compra utilizando PHP Orientado a Objeto e nesta aula, criaremos realmente a parte do carrinho de compras.

Ao pensarmos em um carrinho de compras no mundo real, imaginamos um carrinho mesmo, o qual você possa colocar vários produtos iguais ou diversificados.

Ao desenvolvermos, precisamos armazenar esses itens para que possamos navegar entre as páginas para realizar novas compras. Dessa forma podemos trabalhar com Session, Cookie, Banco de Dados, etc. Então precisamos definir um comportamento do nosso carrinho.

No nosso carrinho teremos que ter a possibilidade de adicionar produto, editar a quantidade, excluir, retornar todos os produtos e o valor total da compra.

<?php 

namespace App\Model\Shopping;

interface Cart{
    public function add(CartItem $item);
    public function update(CartItem $item);
    public function delete($id);
    public function has($id);
    public function getTotal();
    public function getCartItems();
 }

Veja que temos um participante, que é o CartItem. Já sabemos que estamos realizando uma indução de tipo garantido que receba um objeto que seja da classe CartItem.

Esse CartItem será responsável por receber o produto e quantidade. Com isso, o carrinho de compra só fica responsável pelas ações que informamos anteriormente e tira a responsabilidade de gerenciar a quantidade de um produto.

Com nossa interface definida e nosso CartItem definido, basta implementar. Na vídeo aula, utilizei a SESSION, mas poderia utilizar o banco de dados, implementando nossa interface, que teríamos os comportamentos que definimos.

Nossos cursos indicados

A lógica aplicada é adicionar as informações num atributo chamado itens, e depois salvar as informações numa SESSION.

Em nosso exemplo, salvamos quando foi encerrado o objeto e salvamos o valor serializado na SESSION.

Mas por que serializar os itens do carrinho da SESSION ao invés de adicionar normalmente como fosse num array?

Acontece que após terminar a requisição da sua página, as variáveis são serializadas e quando você inicia a sessão, como session_start, ele vai recuperar as informações, deserializar e se tiver um objeto ele vai recuperar. Se este objeto não foi incluído, ele vai retornar um __PHP_Incomplete_Class.

Como utilizamos autoload, mas incluímos só depois de iniciar session_start, teremos esse problema. Temos duas soluções para resolver isso: ou iniciamos a session_start depois do autoload, ou serializamos o objeto antes de adicionar a sessão e depois basta recuperá-la, mas o autoload já estaria já carregado.

Passamos para nossos controller o que desejamos trabalhar com injeção de dependência passando só a interface, que no caso seria Cart. Dessa forma poderíamos ter uma implementação como CartDb, que continuaria a trabalhar, pois estaria implementado a interface Cart.

<?php 

class CartSession implements Cart{

}

class CartCookie implements Cart{

}

class CartDb implements Cart{

}

Bom, é isso!

Espero que tenham gostado desse conteúdo.

Um abraço e até a próxima.

 

F