Привет, Хабр. В этой статье я хочу поделиться своим опытом использования ресурсных контроллеров в CRUD приложении на фреймворке Laravel - простенькой CRM. Итак начнём. Проект опубликован как свободное ПО. Создать веб-приложение для учёта бизнес-клиентов: карточки организаций и их представителей, заявки, события, договора по принципу CRUD. Будем использовать свободное программное обеспечение. В качестве PHP - фреймворка будем использовать Laravel и Bootstrap в качестве его компонента для построения страниц HTML. И поскольку это обычное CRUD приложение, то будем использовать ресурсные контроллеры для базовых действий: создание (create), чтение (read), модификация (update), удаление (delete). Создаём проект Laravel, используя Composer: Подключаем Bootstrap, делаем форму входа для пользователей и собираем через npm: Создаём модель для бизнес-клиентов, а также заодно к ней миграцию, фабрику, наполнитель, политику, контроллер и запрос формы: Остальные модели также. Генерируем миграции для сессий и очередей: Создайте по необходимости в папке database/seeder файлы для наполнения базы данных первичными данными, например для создания пользователя-админа: Настраиваем миграции. Таблица для клиентов будет выглядеть примерно так: После запускаем миграции с наполнением БД: :fresh - удалит существующие таблицы в БД. Итак, в папке app/Http/Controllers будет нас ждать ресурсный контроллер ClientController. Там будут объявлены методы: index, create, store, show, edit, update, destroy. Метод index должен отображать список клиентов. Напишем так, чтобы он выводил сначала новые записи, разбивая на страницы по 20 записей, используя для вывода Blade шаблон 'client-index': Метод create должен вывести форму для заполнения данных о клиенте и кнопку для добавления его в БД. Мы используем Blade шаблон 'client-edit' и для добавления и для редактирования данных, чтобы шаблон понимал, какое именно из этих действий выполняется, мы будем передавать ему переменную edit , где значение 0 - для добавления нового, а 1 - для изменения существующего. Переменную client мы просто заполняем начальными данными из модели Client Метод edit похож на метод create. Только здесь edit = 1, а переменная client заполняется моделью существующего клиента, переданного через маршрут: Метод show отображает карточку клиента: Метод store добавляет нового клиента в БД, а метод update обновляет данные у существующего в БД: Метод destroy удаляет запись из БД: Теперь рассмотрим, что такое StoreClientRequest и UpdateClientRequest. Дело в том, что перед внесением записей в БД, мы должны проверить корректность данных и авторизовать действие пользователя, то есть пройти валидацию запроса. Они называются запросами формы и лежат в папке app/Http/Requests. Так будет примерно выглядеть StoreClientRequest, который проверяет данные нового клиента перед добавлением: UpdateClientRequest будет выглядеть примерно также. Теперь настроим маршруты в routes/web.php: Маршруты для методов ресурсного контроллера создаются автоматически Laravel, не надо для каждого метода прописывать отдельный маршрут. Для объявления маршрутов ресурсного контроллера мы используем Route::resources , передавая массив ресурсных контроллеров. Так для клиентов Laravel создаст следующие маршруты: clients.index clients.show clients.create clients.edit clients.store clients.update clients.destroy Теперь о 'clients.representatives' => ClientRepresentativeController::class , это объявление маршрутов к методам контроллера вложенных ресурсов. В нашей CRM ведётся учёт представителей бизнес-клиентов. Модель представителей является дочерней для модели клиентов. И чтобы мы могли увидеть, например всех представителей для конкретного клиента по адресу вроде https://crm.example.com/clients/123/representatives, мы создадим контроллер вложенных ресурсов: Метод index выведет список представителей для конкретного клиента. Метод create выведет форму для создания представителя, а также укажет для какого клиента он создаётся. Метод store сохранит запись о новом представителе с указанием id клиента. А для остальных методов нам не нужен контроллер вложенных ресурсов, поскольку каждая существующая запись о представителях имеет уникальный идентификатор, и с ними мы можем взаимодействовать через обычный ресурсный контроллер RepresentativeController. А Laravel нам также создаст маршруты для методов контроллера вложенных ресурсов: clients.representatives.index clients.representatives.create clients.representatives.store Полностью посмотреть код, в том числе шаблоны Blade вы можете по ссылке. Laravel backend