Editar registros en Laravel

Vamos a proceder a dar un paso más en nuestro tutorial y vamos a aprender a editar registros en Laravel como parte de nuestro CRUD.

Para ello como ya vamos haciendo de forma automática hay que seguir una serie de pasos.

Creamos una ruta que lleva al formulario

Desde routes/web.php creamos una nueva ruta:

Route::get('mensaje/{slug?}/editar', 'MensajesController@edit')->name('editarMensaje');

Aquí le decimos a Laravel que cuando acceda a mensaje/slug/editar ejecute la acción editar del controlador MensajesController.

Creamos la acción edit en el controlador

Dentro de app/Http/Controllers/MensajesControllers.php buscamos el método edit y lo dejamos de la siguiente forma:

public function edit($slug)
{
    $mensaje = mensaje::whereSlug($slug)->firstOrFail();
    return view('mensajes.edit', compact('mensaje'));
}

Aquí buscamos el mensaje dependiendo de su slug, el cual viene como un argumento y usando el método firstOrFail().

Y después devolvemos la vista, mensajes.edit para mostrar el formulario de edición.

Creamos la vista de edición «edit»

Nos vamos a resources/views/mensajes y creamos el archivo edit.blade.php

En ella ponemos el siguiente contenido, que como podemos ver es muy parecido al formulario para crear contenido:

@extends('layouts.app')
@section('title', 'Contact')
@section('content')
	<div class="container col-md-8 col-md-offset-2">
		<div class="well well bs-component">
			<form class="form-horizontal" method="post">
				@foreach ($errors->all() as $error)
				 	<div class="alert alert-danger">{{ $error }}</div>
				@endforeach
				@if(session('status'))
					<div class="alert alert-success">
						{{ session('status') }}
					</div>
				@endif
				{!! csrf_field() !!}
				<fieldset>
					<legend>Editar mensaje</legend>
					<div class="form-group">
						<label for="titulo" class="col-lg-label">Título</label>
						<div class="col-lg-10">
							<input type="text" class="form-control" id="titulo" name="titulo" value="{!!  $mensaje->titulo !!}">
						</div>
					</div>
					
					<div class="form-group">
						<label for="contenido" class="col-lg-label">Contenido</label>
						<div class="col-lg-10">
							<textarea class="form-control" rows="3" id="contenido" name="contenido">{!! $mensaje->contenido !!}</textarea>
						</div>
					</div>

					<div class="form-group">
						<input type="checkbox" name="status" {!! $mensaje->status?"":"checked" !!}> ¿Cerrar este mensaje?
					</div>

					<div class="form-group">
						<div class="col-lg-10 col-lg-offset-2">
							<button class="btn btn-default">Cancelar</button>
							<button type="submit" class="ntm btn-primary">Actualizar</button>
						</div>
					</div>
					
				</fieldset>
			</form>
		</div>
	</div>
@endsection

Su principal diferencia es que nos estamos trayendo los valores del mensaje y que le estamos poniendo una checbox para modificar el estatus.

Crear el enlace a la página de edición

Para esto tenemos que irnos a nuestra vista show.blade.php donde mostramos el mensaje y desde ahí en el botón de editar utilizar un helper que realizará la acción.

<a href="{!! action('MensajesController@edit', $mensaje->slug) !!}" class="btn btn-info">Editar</a>

Crear la ruta para modificar el registro

Para ello nos vamos al archivo de rutas y creamos una ruta post, al igual que hicimos para crear el registro:

Route::post('mensaje/{slug?}/editar', 'MensajesController@update');

Crear la accion update

Ahora en  en el controlador MensajesController en la acción update hacemos lo siguiente:

public function update(MensajeFormRequest $request, $slug)
{
    $mensaje = Mensaje::whereSlug($slug)->firstOrFail();
    $mensaje->titulo = $request->get('titulo');
    $mensaje->contenido = $request->get('contenido');
    
    if($request->get('status') != null){
        $mensaje->status = 0;
    }else{
        $mensaje->status = 1;
    }
    $mensaje->save();
    return redirect(action('MensajesController@edit', $mensaje->slug))->with('status', 'El mensaje ' . $slug . ' ha sido actualizado');

En el que volvemos a validar el formulario, usamos el método firstOrFail(), luego recogemos el titulo y el contenido, determinamos como se encuentra el status y finalmente redirigimos al usuario a la página de edición del mensaje donde  indicamos que se ha llevado a cabo la modificación.

Con esto ya funcionaría nuestra funcionalidad para editar registros en Laravel y se nos abre todo un abanico de posibilidades