
Создание простого блога на Laravel 11: Реализация CRUD для постов

В прошлой статье мы создали модель, миграцию, фабрику и сидер. В этой статье мы реализуем CRUD функционал для постов блога.
Создание контроллера PostController
Сгенерируем контроллер для работы с постами:
php artisan make:controller PostController
Этот контроллер будет находиться в app/Http/Controllers/PostController.php
. Мы добавим в него методы для обработки CRUD-операций.
Настройка маршрутов в Laravel
Более подробно про роутинг можно прочитать в официальной документации Laravel.
Добавим маршруты в файл routes/web.php
:
use App\Http\Controllers\PostController;
Route::get('/', [PostController::class, 'index'])->name('posts.index'); // Главная страница со списком всех постов
Route::get('/posts/create', [PostController::class, 'create'])->name('posts.create'); // Форма создания поста
Route::post('/posts', [PostController::class, 'store'])->name('posts.store'); // Сохранение нового поста
Route::get('/posts/{post}/edit', [PostController::class, 'edit'])->name('posts.edit'); // Форма редактирования поста
Route::put('/posts/{post}', [PostController::class, 'update'])->name('posts.update'); // Обновление поста
Route::delete('/posts/{post}', [PostController::class, 'destroy'])->name('posts.destroy'); // Удаление поста
Реализация методов в контроллере
Теперь в контроллере PostController
напишем код для CRUD функционала.
Список всех постов (index)
Метод для отображения списка постов:
use App\Models\Post;
public function index()
{
$posts = Post::latest()->paginate(5); // Получаем посты с пагинацией
return view('posts.index', compact('posts'));
}
Форма создания поста (create)
В этом методе мы только отображаем форму для создания поста, но не создаем его. Сам метод:
public function create()
{
return view('posts.create');
}
Сохранение нового поста (store)
Метод для сохранения нового поста:
use Illuminate\Http\Request;
public function store(Request $request)
{
$request->validate([
'title' => 'required|max:255',
'content' => 'required',
'author' => 'required|max:100',
]);
Post::create($request->all()); // Создаем пост
return redirect()->route('posts.index')->with('success', 'Пост успешно создан!');
}
Форма редактирования поста (edit)
В этом методе мы только отображаем форму для редактирования поста, но не обновляем его. Сам метод:
public function edit(Post $post)
{
return view('posts.edit', compact('post'));
}
Обновление поста (update)
Метод для обновления поста:
public function update(Request $request, Post $post)
{
$request->validate([
'title' => 'required|max:255',
'content' => 'required',
'author' => 'required|max:100',
]);
$post->update($request->all()); // Обновляем пост
return redirect()->route('posts.index')->with('success', 'Пост успешно обновлен!');
}
Удаление поста (destroy)
Метод для удаления поста:
public function destroy(Post $post)
{
$post->delete(); // Удаляем пост
return redirect()->route('posts.index')->with('success', 'Пост успешно удален!');
}
Создание шаблонов Blade
Главная страница со списком постов
Создаем файл index.blade.php
в директории resources/views/posts
. Пагинация выводится следующим образом: {{ $variableName->links() }}
. Готовый код:
@extends('layout')
@section('content')
<h1>Список постов</h1>
<a href="{{ route('posts.create') }}" class="btn btn-primary">Создать пост</a>
@if(session('success')) <!-- Уведомляем об успешном создании -->
<div class="alert alert-success">{{ session('success') }}</div>
@endif
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>Заголовок</th>
<th>Автор</th>
<th>Действия</th>
</tr>
</thead>
<tbody>
@foreach($posts as $post)
<tr>
<td>{{ $post->id }}</td>
<td>{{ $post->title }}</td>
<td>{{ $post->author }}</td>
<td>
<a href="{{ route('posts.edit', $post) }}" class="btn btn-warning">Редактировать</a>
<form action="{{ route('posts.destroy', $post) }}" method="POST" style="display:inline-block">
@csrf
@method('DELETE')
<button class="btn btn-danger" onclick="return confirm('Удалить пост?')">Удалить</button>
</form>
</td>
</tr>
@endforeach
</tbody>
</table>
{{ $posts->links() }} <!-- Пагинация -->
@endsection
Форма создания/редактирования поста
Создаем файл form.blade.php
в той же директории (resources/views/posts/form.blade.php
). Этот шаблон будет переиспользоваться:
<div class="form-group">
<label for="title">Заголовок</label>
<input type="text" name="title" class="form-control" value="{{ old('title', $post->title ?? '') }}" required>
</div>
<div class="form-group">
<label for="content">Содержимое</label>
<textarea name="content" class="form-control" rows="5" required>{{ old('content', $post->content ?? '') }}</textarea>
</div>
<div class="form-group">
<label for="author">Автор</label>
<input type="text" name="author" class="form-control" value="{{ old('author', $post->author ?? '') }}" required>
</div>
Форма создания поста
Создаем файл create.blade.php
в той же директории (resources/posts/create.blade.php
):
@extends('layout')
@section('content')
<h1>Создать пост</h1>
<form action="{{ route('posts.store') }}" method="POST">
@csrf
@include('posts.form')
<button type="submit" class="btn btn-success">Сохранить</button>
</form>
@endsection
Форма редактирования поста
Создаем файл edit.blade.php
в той же директории (resources/posts/edit.blade.php
):
@extends('layout')
@section('content')
<h1>Редактировать пост</h1>
<form action="{{ route('posts.update', $post) }}" method="POST">
@csrf
@method('PUT')
@include('posts.form')
<button type="submit" class="btn btn-success">Обновить</button>
</form>
@endsection
Следующие шаги
В следующий статье мы мы добавим пагинацию и поиск постов для нашего блога на Laravel 11.
Ссылки
- Официальная документация Laravel
- Создание простого блога на Laravel 11: Установка и настройка окружения
- Создание простого блога на Laravel 11: Создание моделей, миграций и сидов
- Лучшие практики при работе с REST API на примере PHP, Python, Node.js
- SEO для начинающих в 2025 году: Введение в основы SEO