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

Depois da validação perco os dados do POST

Bom dia.

Surgiu uma dúvida aqui. Eu sempre uso um exemplo de pagamentos e parcelas porque tem várias situações para testar. Aí as dúvidas aparecem.

A lógica é a seguinte:

  • A) Informar os dados de um pagamento e submeter o formulário.
  • B) Controller recebe a rota e direciona para um Model validar dos dados do pagamento.
  • C) Se estiverem certos, o Model retorna os dados para o Controller.
  • D) O controller chama uma outra rota, onde o usuário informa as parcelas e também carrega com os dados que foram validados.
  • E) Segue a lógica da mesma forma para validar as parcelas...

Abaixo o exemplo.

class ValidarPagamento implements InterfaceControllerRequisicao
{
  public function processarRequisicao(): void
  {
    $valorTotal = $_POST['valorTotal'];
    $qtdeParcelas = $_POST['qtdeParcelas'];
    // echo gettype($valorTotal);
    // echo gettype($qtdeParcelas);

    // exit;

    $pagto = new Pagamento();
    $status = $pagto->validarPagamento($qtdeParcelas, $valorTotal);

    if ($status === false) {
      header("Location: /novo-pagamento");
    } else {
      $valorTotal = $pagto->getValorTotal(); 
      header('Location: /resumo-pagamento');
    // como passar variáveis para esta rota?
    }
  }
}

Se estiver validado, chama a rota /resumo-pagamento, onde um Controller irá direcionar para o respectivo formulário (que exibe os dados que forma validados e o usuário pode informar as parcelas). É como se fossem em etapas. Tipo next, next, finish.

Como eu poderia carregar os dados que já foram validados se o POST já não existe mais com as informações?

7 respostas

Fala, Flávio.

Te recomendo fazer o curso de HTTP pra entender um pouco melhor como funciona a web, mas basicamente:

Cada requisição é completamente independente, logo, ao redirecionar o usuário, uma nova requisição é criada, sem nenhuma informação da requisição anterior.

Se você precisar armazenar dados entre requisições (para autenticação, por exemplo), podemos utilizar sessões.

Agora, nesse seu caso, não faz sentido separar em mais de uma requisição. Se você tem todos os dados (valor total e número de parcelas), deveria fazer tudo em uma requisição.

PS.: validarPagamento é um método que mostra que você ainda está utilizando programação procedural e não orientada a objetos. Mude para algo do tipo:

$pagamento = new Pagamento($valorTotal, $numeroDeParcelas);

Quem usa essa classe não deveria precisar chamar um método extra pra validar o pagamento. Um pagamento sempre deve ser válido. ;-)

Obirgado pelas respostas Vinícius. Cada vez fica mais claro o que não devo fazer :)

Desculpa as perguntas insistentes. Eu me interessei muito por padrões na programação e eu quero fazer as coisas direito.

Mas infelizmente parece que a teoria é mais fácil do que a prática :/

Por que não é correto ter uma classe que valida um pagamento desta forma que fiz? Eu só devo ter uma classe e nela conter tudo o que for referente a um pagamento, inclusive a validação?

Eu sei que minha dificuldade está no conceito. Talvez estas respostas só vão sanar dificuldades pontuais. Mas o problema do conceito ainda existirá.

Tá vendo a minha dificuldade? :) Eu sei criar uma classe, sei criar atributos e métodos, sei quando deve ser privado, púbico e protegido, sei herdar, estender, etc. Entendi os exemplos dos treinamentos aqui na Alura de OO (Pessoa, Conta, CPF, Titular, etc) e os exemplos do treinamento de MVC (Cursos e Login). Acho que já a terceira vez que assisto estes treinamentos.

Mas, saber criar é uma coisa. Como criar de forma orientada a objetos e saber usar conforme este paradigma, é outra coisa... :(

Me dá uma luz aí. Já andei vendo os materiais que vc indicou outro dia (DDD, Clean Architecture) mas sinto que me falta alguma coisa mais base ainda, não de criar arquivos php como classe que tenham métodos e atributos. Isso acho que já sei fazer. O problema está mais no conceitual de como este sistema se organiza. Como ele interage.

Parece que falta uma "cola" pra grudar tudo isso na mente. Parece que só consigo entender os cursos. Quando crio meus projetos, aí embola.

Vc indica mais algum material?

Obrigado!

solução!

Opa, Flavio.

Não precisa se desculpar. Fico feliz que você esteja interessado pelo assunto.

Vou deixar aqui alguns links pra você começar a se guiar:

Por que não é correto ter uma classe que valida um pagamento desta forma que fiz?

Pensa no mundo real: Você vai numa padaria, consome algo e faz um pagamento, certo? Se você entregar o valor errado (a menos), o pagamento não vai ser realizado. O caixa vai negar. Logo, você não tem um pagamento. Você tentou criar um pagamento, mas não conseguiu.

Isso que a gente tem que passar pro código. Eu não posso criar um Pagamento que não esteja válido. Um objeto de domínio como esse sempre precisa estar um estado válido, logo, eu já preciso criá-lo de forma válida.

Agora, você pode realizar o pagamento e escolher se recebe o troco ou não, certo? Então o método troco() poderia existir que você continuaria respeitando a orientação a objetos.

Sempre que for modelar, pensei: Isso faz sentido enquanto eu leio? Se fizer sentido pro mundo real, ótimo, você provavelmente está utilizando OO. "Vou fazer um pagamento".

Agora: "Vou fazer um pagamento e depois dele já feito, vou validar esse pagamento[...]". Isso não parece muito natural quando a gente fala, concorda?

Cara, muito obrigado pela atenção.

Já estou vendo os materiais. A explicação do objeto já deu uma clareada.

Ainda teria mais umas coisas para perguntar. Embora faça parte do assunto, é algo um pouco mais técnico.

Como aqui já tem bastante coisa conceitual, outro dia eu posto.

Mas muito obrigado mesmo. Este é uma meta entender e aplicar PHP com MVC de cabo a rabo.

Abs!

Que nada, man.

Como você tá focado em estudar boas práticas, recomendo que você faça parte de alguma comunidade local de PHP, e te convido pra entrar no PHP Rio também. Lá você pode tirar dúvidas de forma mais rápida do que aqui no fórum e compartilhar ideias:

https://t.me/phprio

Legal. Obrigado!

Não se esquece de marcar o tópico como solucionado, man.

:-D