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