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

Создание простого блога на 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.

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x