laravel 5.6 implementacion de arquitectura rest con query builder


para generar un Restfull controller debemos agregar la opcion "--resource" a nuestro comando de creacion de controlador


php artisan make:controller MessagesController --resource

/**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }

ahora vamos a crear la ruta que llame al metodo create para que nos muestre el formulario de creacion

en routes/web.php:

Route::get('mensajes/crear', ['as'=>'messages.create','uses'=>'MessagesController@create']);

por convencion el nombre de la ruta
sera el nombre del recurso + un punto + el metodo del controlador

creamos en resources/views la carpeta messages y dentro la vista create.blade.php

para poder llamarla desde el controlador asi:

public function create()
    {
        return view('messages.create');
    }

ahora hacemos lo mismo para la funcion que procesa los datos del formulario:

en web.php

Route::post('mensajes', ['as'=>'messages.store','uses'=>'MessagesController@store']);


en la vista create.blade.php

<form method="POST" action="{{ route('messages.store') }}">


en el controller:

use DB;
use Carbon\Carbon;
 public function store(Request $request)
    {
        DB::table('messages')->insert([
            "nombre" => $request->input('nombre'),
            "email" => $request->input('email'),
            "mensaje" => $request->input('mensaje'),
            "created_at" => Carbon::now(),
            "updated_at" => Carbon::now()
        ]);
        return redirect()->route('messages.index');
    }

nos falta crear ahora la ruta messages.index, la vista y la llamada en el controller.

Route::get('mensajes', ['as'=>'messages.index','uses'=>'MessagesController@index']);

  public function index()
    {
        $messages = DB::table('messages')->get();
        return view('messages.index',compact('messages'));
    
    }
en la vista
@foreach($messages as $message)
<tr>
<td> {{$message->nombre}}</td>
<td>{{$message->email}}</td>
<td>{{$message->mensaje}}</td>
           
       
</tr>
@endforeach


para ver los datos de un mensaje por id

Route::get('mensajes/{id}', ['as'=>'messages.show','uses'=>'MessagesController@show']);

en el controller

use DB;
public function show($id)
    {
        $message = DB::table('messages')->where('id',$id)->first();
        return view('messages.show',compact('message'));
    }

en la vista de index. podemos agregar un link por cada registro para ver informacion de ese registro
asi:

<li><a href="{{ route('messages.show',$message->id) }} ">ver</a> </li>

igualmente para editar:

Route::get('mensajes/{id}/edit', ['as'=>'messages.edit','uses'=>'MessagesController@edit']);
Route::put('mensajes/{id}', ['as'=>'messages.update','uses'=>'MessagesController@update']);

la primera ruta llama a la vista con el formulario de edicion
la segunda ruta ejecuta la edicion

en el controller:

 public function edit($id)
    {
        $message = DB::table('messages')->where('id',$id)->first();
         return view('messages.edit',compact('message'));
    
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        
        DB::table('messages')->where('id',$id)->update([
            "nombre" => $request->input('nombre'),
            "email" => $request->input('email'),
            "mensaje" => $request->input('mensaje'),
            "updated_at" => Carbon::now()
        ]);
        return redirect()->route('messages.index');
    }
y en la vista edit.blade.php:

<form method="POST" action="{{ route('messages.update', $message->id) }}">
{{-- <input type="hidden" name="_token" value="{{ csrf_token() }}">
--}}
{!! method_field('PUT') !!}

{!!  csrf_field() !!}
<label for="nombre">
nombre
<input type="text" name="nombre" value="{{ $message->nombre }}">
{!! $errors->first('nombre','<span  class=error>:message</span>') !!}
</label>
<label for="email">
email
<input type="text" name="email" value="{{ $message->email }}">
{!! $errors->first('email','<span  class=error>:message</span>') !!}
</label>
<label for="mensaje">
mensaje
<textarea name="mensaje">{{$message->mensaje }}</textarea>
{!! $errors->first('mensaje','<span  class=error>:message</span>') !!}
</label>

<input type="submit" value="enviar">

</form>


para eliminar un registro:

Route::delete('mensajes/{id}', ['as'=>'messages.destroy','uses'=>'MessagesController@destroy']);

desde el listado se puede llamar por cada registro asi:

<form style="display:inline" method="POST" action="{{route('messages.destroy',$message->id)}}">
            {!! method_field('DELETE') !!}
            {!!  csrf_field() !!}
<input type="submit" value="eliminar">
           
            </form>

y en controller

 public function destroy($id)
    {
        DB::table('messages')->where('id',$id)->delete();
     return redirect()->route('messages.index');
    }


No hay comentarios:

Publicar un comentario

linux ubuntu mint actualizar chrome

 desde una terminal: $ sudo apt update $ sudo apt install google-chrome-stable