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

Atualizar produto

Olá!

Estou com uma dúvida sobre a implementação da alteração do produto no curso de Laravel II.

Eu gostaria de não precisar duplicar o formulário, sendo assim basicamente adicionei um input do tipo hidden com o valor do ID. Para que isso fosse possível, precisei alterar o código do método que salva o registro no banco (a parte de carregar o produto para edição está ok, funciona). Aqui está meu método de salvar o produto:

  public function adicionar()
  {
    // Produto::create(Request::all());

    $id = Request::input('id');

    if ($id > 0) {
      $produto = Produto::find($id);
    } else {
      $produto = new Produto();
    }

    $produto->nome = Request::input('nome');
    $produto->quantidade = Request::input('quantidade');
    $produto->valor = Request::input('valor');
    $produto->descricao = Request::input('descricao');
    $produto->save();

    return redirect()
           ->action('ProdutoController@listar')
           ->withInput(Request::only('nome'));
  }

A minha dúvida é: vou perder a facilidade de utilizar o Produto::Create(Request::all()) uma vez que preciso tentar carregar o produto antes para ver se já existe? O jeito que escrevi o método está bom?

6 respostas
solução!

Oi André, tudo bom?

Acredito que a melhor abordagem seja ter uma action pra cada funcionalidade. Por mais que a adição e a edição compartilhem os mesmos inputs, elas podem ter actions diferentes. No back-end, devemos ter um método no controller para adicionar e um para editar. Algo como:

public function adicionar()
  {
    $produto = Produto::create(Request::all());

    $produto->save();

    return redirect()
           ->action('ProdutoController@listar')
           ->withInput(Request::only('nome'));
  }

public function editar()
{
    $id = Request::input('id');
    if ($id > 0) {
      $produto = Produto::find($id);
    } else {
    // O produto não existe no banco, então não é uma edição. Aqui podemos lançar uma exception indicando o problema
    }
// Como o ID está salvo no request pelo input escondido, rola usar o o create também =)
    $produto = Produto::create(Request::all());

    $produto->save();
}

Os métodos podem parecer meio repetitivos mas são duas funcionalidades diferentes e é bem importante a gente separar essas responsabilidades para garantir a manutenibilidade do sistema a longo prazo.

Assim, o formulario de edição bate na action editar e o formulario de adição bate na rota de adicionar. Quando alguma validação for necessária em apenas uma das funcionalidades, você já tem isso bem separado =)

Qualquer problema é só falar.

Abraço

Entendi, achei que era ruim ter o formulário repetido. Isso é normal então?

Muito obrigado André, esclareceu bastante as coisas! Abraço

No front é comum a gente reaproveitar a estrutura do html porque costuma ser algo identico pras duas funcionalidades.

Mas, no back é uma boa prática ter uma rota com cada responsabilidade.

Abraço!

Entendi, só me esclarece então: eu teria dois arquivos de formulário: um para adicionar e outro para editar. Porém, poderia ter um terceiro arquivo que contém o "miolo" do formulário, ou seja, o que fica dentro da tag form. Digo isso por causa do action de cada form ser diferente. Ou tem outra forma de fazer isso?

Boa André, exatamente =)

Muito obrigado!