3
respostas

Eloquent ORM - Alterar Produtos - NotFoundHttpException

Boa tarde, fui fazer o desafio de alterar o produto mas esta dando o erro: NotFoundHttpException

Segua abaixo os codigo:

routes.php

<?php

    Route::get('/', 'WelcomeController@index');

    Route::get('home', 'HomeController@index');

    Route::controllers([
        'auth' => 'Auth\AuthController',
        'password' => 'Auth\PasswordController',
    ]);

Route::get('/', function()
{
    return 'Primeira lógica com Laravel';
});

Route::get('/produtos', 'ProdutoController@lista');
Route::get('/produtos/mostra/{id}','ProdutoController@mostra')->where('id','[0-9]+');
Route::get('/produtos/novo', 'ProdutoController@novo');
Route::post('/produtos/adiciona', 'ProdutoController@adiciona');
Route::post('/produtos/salvaralteracao/{id}', 'ProdutoController@salvaralteracao')->where('id','[0-9]+');
Route::get('/produtos/altera/{id}', 'ProdutoController@altera')->where('id','[0-9]+');;
Route::get('/produtos/json', 'ProdutoController@listaJson');
Route::get('/produtos/remove/{id}', 'ProdutoController@remove');

ProdutoController.php

<?php namespace estoque\Http\Controllers;

use Illuminate\Support\Facades\DB;
use estoque\Produto;

use Request;
class ProdutoController extends Controller {
    public function lista(){

        #$produtos = DB::select('select * from produtos');
        $produtos = Produto::all();
        return view('produto.listagem')->withProdutos($produtos);
    }

    public function  mostra($id){

        $produto = Produto::find($id);
        return view('produto.detalhe')->with('p', $produto);
    }

    public function  altera($id){
        $produto = Produto::find($id);
        return view('produto.formulario-altera')->with('p', $produto);
    }

    public function novo(){
        #$produto = array("id"=>"","descricao"=>"","nome" => "", "valor" => "", "quantidade" => "");
        $produto = Produto::find(0);
        return view('produto.formulario');
    }

    public function salvaralteracao($id){
        echo $id;

        $params = Request::all();
        $produto = Produto::find($id);
        $produto->update($params);

        return redirect()->action('ProdutoController@lista')->withInput(Request::only('nome'));
    }
    public function adiciona(){

        Produto::create(Request::all());

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

    public function remove($id){
        $produto = Produto::find($id);
        $produto->delete();

        return redirect()
            ->action('ProdutoController@lista');
    }
}

Produtos.php

<?php namespace estoque;

use Illuminate\Database\Eloquent\Model;

class Produto extends Model {

    protected $table = 'produtos';
    public $timestamps = false;
    protected $fillable = array('nome','descricao', 'valor', 'quantidade');

}

formulario.blade.php

@extends('layout.principal')

@section('conteudo')

    <h1>Novo produto</h1>

    <form action="/produtos/altera" method="post">
        <input type="hidden"
               name="_token" value="{{{ csrf_token() }}}">
        <div class="form-group">
            <label>Nome</label>
            <input name="nome" class="form-control">
        </div>
        <div class="form-group">
            <label>Descricao</label>
            <input name="descricao" class="form-control">
        </div>
        <div class="form-group">
            <label>Valor</label>
            <input name="valor" type="number" class="form-control">
        </div>
        <div class="form-group">
            <label>Quantidade</label>
            <input type="number" name="quantidade" class="form-control">
        </div>
        <button type="submit" class="btn btn-primary btn-block">Adicionar</button>
    </form>

@stop
3 respostas

Segunda parte do código

formulario-altera.blade.php

@extends('layout.principal')

@section('conteudo')

    <h1>Novo produto</h1>

    <form action="/produtos/salvaralteracao" method="post">
        <input type="hidden" name="id" class="form-control" value={{$p->id}}>
        <input type="hidden"
               name="_token" value="{{{ csrf_token() }}}">
        <div class="form-group">
            <label>Nome</label>
            <input name="nome" class="form-control"  value={{$p->nome}}>
        </div>
        <div class="form-group">
            <label>Descricao</label>
            <input name="descricao" class="form-control" value={{$p->descricao}}>
        </div>
        <div class="form-group">
            <label>Valor</label>
            <input name="valor" type="number" class="form-control" value={{$p->valor}}>
        </div>
        <div class="form-group">
            <label>Quantidade</label>
            <input type="number" name="quantidade" class="form-control" value={{$p->quantidade}}>
        </div>
        <button type="submit" class="btn btn-primary btn-block">Salvar</button>
    </form>

@stop

altera.blade.php

@extends('layout.principal')

@section('conteudo')

    <h1>Novo produto</h1>

    <form action="/produtos/adiciona" method="post">
        <input type="hidden"
               name="_token" value="{{{ csrf_token() }}}" />
        <div class="form-group">
            <label>Nome</label>
            <input name="nome" class="form-control" value={{$p->nome}}/>
        </div>
        <div class="form-group">
            <label>Descricao</label>
            <input name="descricao" class="form-control"/>
        </div>
        <div class="form-group">
            <label>Valor</label>
            <input name="valor" class="form-control"/>
        </div>
        <div class="form-group">
            <label>Quantidade</label>
            <input type="number" name="quantidade" class="form-control"/>
        </div>
        <button type="submit" class="btn btn-primary btn-block">Adicionar</button>
    </form>

@stop

Desde já. Obrigado.

Vinicius, cola a mensagem de erro inteira aqui pra gente entender melhor?

Olá.. Vinicius 1º pq você criaou 2 formularios para alterar o produto, você deve criar apenas 1 e no controller fazer uma função parecida com o adiciona.

vou mandar para você um código para vc ver...

Model

protected $table = 'TabelasBD';
    public $timestamps = false;

    protected $fillable = array('nome-da-coluna1', 'nome-da-coluna2', '); e assim por diante
    protected $guarded =['id', 'created_at', 'update_at'];

controller função editar + update

insira seu código aquipublic function editar($id){
        $variavel = NomeDaSuaModel::find($id);
        if(empty($variavel)) {
            return "Este item não exite";
        }
        return view('SuaView')->with('v', $variavel)->with('NomeDaSuaModels', NomeDaSuaModel::all());
    }

    public function update($id){

        $variavel = NomeDaSuaModel::find($id);
        $variavel->ColunaDoBD_id = Request::input('ColunaDoBD_id');
        $variavel->nome       = Request::input('nome');
        $variavel->save();
        return redirect()->action('SeuController@editar', $id);

E apenas crie uma view para editar no from action vc coloca o endereço do update... lembre-se de na rota pegar o id como vc ja fez...

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software