Урок 07

Resource-контроллеры

Resource-контроллер — это контроллер, который реализует стандартный CRUD по соглашениям Laravel. Одна строка в роутах создаёт 7 маршрутов.

Создание

php artisan make:controller PostController --resource

Создаётся класс с 7 методами:

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class PostController extends Controller
{
    public function index() {}
    public function create() {}
    public function store(Request $request) {}
    public function show(string $id) {}
    public function edit(string $id) {}
    public function update(Request $request, string $id) {}
    public function destroy(string $id) {}
}

Регистрация

Route::resource('posts', PostController::class);

Laravel создаёт маршруты:

МетодURLДействиеИмя
GET/postsindexposts.index
GET/posts/createcreateposts.create
POST/postsstoreposts.store
GET/posts/{post}showposts.show
GET/posts/{post}/editeditposts.edit
PUT/PATCH/posts/{post}updateposts.update
DELETE/posts/{post}destroyposts.destroy

Ограничение методов

Только чтение:

Route::resource('posts', PostController::class)->only(['index', 'show']);

Всё, кроме удаления:

Route::resource('posts', PostController::class)->except(['destroy']);

API Resource

Для API не нужны create и edit — это формы. Используется apiResource:

php artisan make:controller Api/PostController --api
Route::apiResource('posts', PostController::class);

Создаёт 5 маршрутов: index, store, show, update, destroy.

Вложенные ресурсы

Route::resource('posts.comments', CommentController::class);

URL: /posts/{post}/comments/{comment}. Методы контроллера получат оба параметра.

Мягкое удаление

Если модель использует SoftDeletes:

Route::resource('posts', PostController::class)->withTrashed(['show']);

Именование параметров

По умолчанию параметр — {post}. Если модель называется иначе:

Route::resource('articles', PostController::class)
    ->parameters(['articles' => 'post']);