Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Atualizando o banco de dados

Eu entendi a implementação dos métodos com a classe estado orçamento, porém não consegui imaginar como eu faria uma atualização em banco de dados nesse orçamento para os status disponíveis utilizando os estados da classe. Alguém saberia implementar um exemplo para demonstrar?

3 respostas
solução!

Oi Leandro, poderia explicar melhor sua dúvida? Ainda não vi o problema de mapear o banco com sua classe de domínio.

Escrevi um exemplo rápido aqui só a título de demonstração (demanda mt código para algo completo e com melhores práticas), se eu tiver entendido errado sua dúvida vc me fala.

// modelo de dominio simplificado

interface EstadoOrcamento
{

}

interface RepositorioDeOrcamento
{
    public function salva(Orcamento $orcamento);
}

class Orcamento
{
        private float $valor;
        private EstadoOrcamento $estado;

        public function __construct(float $valor, EstadoOrcamento $estado)
        {
            $this->valor = $valor;
            $this->estado = $estado;
        }

        public function valor(): float
        {
            return $this->valor;
        }

        public function estadoOrcamento(): EstadoOrcamento
        {
            return $this->estado;
        }
}



class EmAprovacao implements EstadoOrcamento
{

}

class Aprovado implements EstadoOrcamento
{

}

// camada de persistencia simplificada

class RepositorioDeOrcamentoComPDO implements RepositorioDeOrcamento
{
        public function salva(Orcamento $orcamento)
        {    
                    $estado = $this->mapeiaEstadoOrcamento($orcamento);
                    $query = "INSERT INTO orcamento VALUES ({$orcamento->valor()}, {$estado})";

                    //restante do código para persistir o orcamento após a query montada...
        }

        private function mapeiaEstadoOrcamento($orcamento): int
        {
                $estado = get_class($orcamento->estadoOrcamento());

                switch($estado) {
                        case 'EmAprovacao' :
                                return 1;
                                break;
                        case 'Aprovado' :
                                return 2;
                                break;
                }
        }
}

Entendi como implementar, ajudou bastante.. poderia ter até um método nas classes de estados que retornasse o valor a ser persistido no banco.

"...poderia ter até um método nas classes de estados que retornasse o valor a ser persistido no banco."

Então Leandro, é uma alternativa, mas não sou fã dessa abordagem por que mistura detalhes de persistência na sua classe de domínio. O ideal é sempre pensar nas suas classes de domínio de forma agnóstica de como vc vai implementar a persistência, separando assim bem as responsabilidades em seu código.