¡Esta es una revisión vieja del documento!
Tabla de Contenidos
Crear un CRUD con Laravel
Rutas
Creamos rutas en routes/web.php:
Route::get('/', HomeController::class); Route::get('/posts', [PostController::class, 'index']); Route::get('/posts/create', [PostController::class, 'create']); Route::get('/posts/{post}', [PostController::class, 'show']);
Listar posts
Controlador PostController.php, centrándonos en el listado de posts:
namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function index() { $posts = Post:all(); return view('posts.index', ["posts" => $posts]); // return view('posts.index', compact('posts')); }
Vista para listar los posts:
php artisan make:view posts.index
Creará un fichero index.blade.php en resources/views/posts/
<h1>Listado de posts</h1> <ul> @foreach ($posts as $post) <li><a href="/posts/{{$post->id}}"> {{ $post->title }}</a></li> @endforeach </ul>
Mostrar un post
Controlador PostController.php, centrándonos en mostrar un post en concreto:
namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function show($post) { // Buscamos el registro a partir de la ID $post = Post::find($post); return view('posts.index', ["post" => $post]); // return view('posts.index', compact('post')); }
Vista para mostrar un post:
php artisan make:view show.index
Creará un fichero show.blade.php en resources/views/posts/:
<h1>Título: {{ $post->title }}</h1> <p>Categoría: {{ $post->category }}</p> <p>{{ $post->content }}</p> <p><a href="/posts/{{$post->id}}/edit">Editar post</a></p> <form action="/posts/{{$post->id}}" method="post"> @csrf @method('DELETE') <button type="submit">Eliminar post</button> </form>
Crear un post
Controlador PostController.php, centrándonos en la creación de un post:
namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function create() { return view('posts.create') }
Vista para crear un post:
php artisan make:view create.index
Creará un fichero create.blade.php en resources/views/posts/:
<h1>Formulario para crear un nuevo post</h1> <form action="/posts" method="post"> <!-- Incluir token en un input oculto --> @csrf <label>Título</label> <input type="text" name="title"> <br> <label>Categoría</label> <input type="text" name="category"> <br> <label>Contenido</label> <textarea name="content"></textarea> <button type="submit">Crear post</button> </form>
Por seguridad, en el envío de los formularios con Laravel es necesario incluir un token. De lo contrario, nos daría un error 419.
Creamos una nueva ruta para la recepción del formulario, en web.php:
Route::post('/posts/', [PostController::class, 'store']);
Vamos a PostController.php y definimos el método store():
// .. public function store(Request $request) { $post = new Post(); $post->title = $request->title; $post->category = $request->category; $post->content = $request->content; $post->save(); // Redirigimos al listado de posts return redirect('/posts'); }
Editar un post
Crearemos dos nuevas rutas en routes/web.php:
Route::get('/posts/{post}/edit', [PostController::class, 'edit']) Route::put('/posts/{post}', [PostController::class, 'update'])
Controlador PostController.php, centrándonos en la edición de un post:
namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function edit($post) { $post = Post::find($post); return view('posts.edit', compact('post')) }
Vista para editar un post:
php artisan make:view edit.index
Creará un fichero edit.blade.php en resources/views/posts/:
<h1>Formulario para crear un nuevo post</h1> <form action="/posts/{{$post->id}}" method="post"> <!-- Incluir token en un input oculto --> @csrf <!-- Especificamos el tipo de método a utilizar --> @method('PUT') <label>Título</label> <input type="text" name="title" value="{{ $post->title }}"> <br> <label>Categoría</label> <input type="text" name="category" value="{{$post->category}}"> <br> <label>Contenido</label> <textarea name="content">{{$post->content}}</textarea> <button type="submit">Actualizar post</button> </form>
Controlador PostController.php, centrándonos en la actualización de un post:
namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function update(Request $request, $post) { //return "Aquí se actualizará el post {$post} $post = Post::find($post); $post->title = $request->title; $post->category = $request->category; $post->content = $request->content; $post->save(); return redirect("/posts/{$post->id}"); }
Eliminar un post
Creamos una nueva ruta en routes/web.php:
Route::delete('/posts/{post}', [PostController::class, 'destroy'])
En la vista de muestra de un post, añadimos un botón para eliminar:
<h1>Título: {{ $post->title }}</h1> <p>Categoría: {{ $post->category }}</p> <p>{{ $post->content }}</p> <p><a href="/posts/{{$post->id}}/edit">Editar post</a></p> <form action="/posts/{{$post->id}}" method="post"> @csrf @method('DELETE') <button type="submit">Eliminar post</button> </form>
Controlador PostController.php, centrándonos en la eliminación de un post:
namespace App\Http\Controllers; use App\Models\Post; class PostController extends Controller { public function destroy($post) { //return "Eliminando el post {$post}" $post = Post::find($post); $post->delete(); return redirect("/posts"); }
