В этом руководстве покажем, как разработать админку для небольшого проекта, используя встроенные инструменты Laravel. Этот процесс позволяет лучше понять структуру фреймворка, улучшить навыки работы с Laravel и почувствовать контроль над каждой частью приложения.
Плюсы разработки своей админки:
-
Глубокое понимание фреймворка: Создавая админку с нуля, вы изучаете работу Laravel изнутри, что помогает лучше понимать, как устроены маршруты, middleware, контроллеры и модели.
-
Полный контроль над функциональностью: Сами решаете, какие функции необходимы в админке, и избегаете лишнего кода, который может быть в сторонних пакетах.
-
Гибкость: Можете реализовать любую бизнес-логику, адаптированную под конкретные требования вашего проекта, без необходимости подстраиваться под ограничения готовых решений.
-
Минимальная зависимость от сторонних библиотек: Снижается вероятность конфликтов версий и уязвимостей, которые могут быть в сторонних пакетах.
Минусы разработки своей админки:
-
Больше времени на разработку: Самостоятельная реализация функциональности (например, CRUD для сущностей) требует больше времени, чем использование готовых решений.
-
Меньше готовых инструментов: Сторонние пакеты часто предоставляют полезные функции «из коробки» (фильтры, сортировка, интерфейсы), которые нужно реализовывать вручную.
-
Ограниченный функционал в упрощенном подходе: Избегая ООП и сложных решений, можно упустить важные аспекты, такие как масштабируемость и модульность.
Что вам понадобится знать:
- Базовые знания языка программирования PHP
- Умение использовать Composer для управления зависимостями
- Умение настроить и подготовить окружение для локальной разработки
Окружение:
В этом руководстве используется следующее окружение:
- Операционная система: Ubuntu 22.04.4 LTS
- PHP: 8.3.15
- Laravel: 9.x
- Composer: 2.7.8
- npm: 10.8.2
- Node: 18.20.5
VDS и VPS
биллингом по всему миру: Россия, Азия и Европа.
Подготовка окружения
Создание пользователя
Создайте пользователя lara и добавьте его в группы sudo и www-data:
Установка PHP 8.3 и расширений для Laravel
Добавьте PPA для PHP:
Установите PHP и расширения:
Установка Composer
Обновите список пакетов:
Скачайте установочный скрипт:
Проверьте целостность файла:
Установите Composer:
Проверьте установку:
Установка Node.js и npm
Удалите старые версии:
Установите Node.js 18.x:
Проверьте версии:
Создание рабочей директории
Создайте папку для проекта:
Установка и настройка Nginx
Установите Nginx:
Настройте виртуальный хост:
Вставьте:
Активируйте конфигурацию:
Перезапустите службы:
Установка Laravel
Создайте проект:
Настройте права на папки и файлы:
Установка и настройка SQLite
Установите расширение SQLite:
Настройте подключение. В файле .env измените строки:
Создайте базу данных:
Измените владельца и группу для файла database.sqlite:
Запустите миграции:
Команду php artisan нужно выполнять из корня проекта: /var/www/laravel-admin.
Настройка провайдера
Провайдеры — это важная часть Laravel, представляющая собой специальные классы для настройки и инициализации компонентов приложения. Они позволяют определить, как должны быть организованы и связаны различные элементы системы. Laravel автоматически загружает провайдеры, указанные в файле config/app.php, что обеспечивает гибкость и модульность в управлении приложением.
Что делает RouteServiceProvider?
RouteServiceProvider — это системный провайдер, который отвечает за маршрутизацию в приложении. Его задачи включают:
- Загрузку файлов маршрутов для веб-приложения, API и других частей системы.
- Привязку моделей к маршрутам.
- Настройку пространств имен (namespaces) для контроллеров.
Этот провайдер помогает организовать маршруты, разделяя их на группы (например, для административной панели и пользовательской части), а также задавать общие правила для маршрутов, такие как middleware, префиксы или ограничения.
Настройка RouteServiceProvider
Файл RouteServiceProvider.php находится в папке app/Providers. Поменяем значение константы HOME и отредактируем метод boot:
Основные изменения и настройки
Свойство HOME:
Определяет маршрут перенаправления для авторизованных пользователей после успешной аутентификации. В данном случае пользователи будут направлены на /dashboard. Это удобно для централизованного управления перенаправлением: если маршрут изменится, достаточно будет обновить только значение константы.
Метод boot:
В методе boot выполняется основная настройка маршрутов. Здесь используется метод routes, который позволяет описать правила маршрутизации для различных частей приложения.
Маршруты для веб-приложения:
Маршруты клиентской части подключаются из файла routes/web.php. Они используют только middleware web, что обеспечивает поддержку сессий, CSRF и других веб-функций.
Маршруты административной панели:
Для маршрутов административной панели добавлено:
- Middleware web и auth, ограничивающие доступ только для авторизованных пользователей.
- Пространство имен
App\Http\Controllers\Dashboard. - Префикс маршрутов
dashboard, что делает их доступными по URL/dashboard/.... - Расположение файла с маршрутами
routes/dashboard.php.
Почему это важно?
Эта структура делает приложение модульным и удобным для масштабирования:
- Разделение маршрутов по файлам упрощает управление ими.
- Пространства имен позволяют использовать разные контроллеры для разных частей приложения.
- Добавление middleware и префиксов на уровне группы маршрутов повышает безопасность и упрощает конфигурацию.
Обновление маршрутов
Создайте файл routes/dashboard.php и добавьте следующий маршрут:
Описание маршрута:
-
Route::get('/'): Этот маршрут отвечает на GET-запросы по адресу/dashboard(так как вRouteServiceProviderдля административной панели установлен префиксdashboard). -
Функция обратного вызова (
callback): В функции обратного вызова возвращается вид (view)dashboard.app. Это базовый шаблон административной панели, который был создан ранее и наследует структуру изmaster.blade.php. -
Именование маршрута:
->name('dashboard.home'). Именование маршрута позволяет обращаться к нему по имениdashboard.homeв шаблонах, контроллерах или при создании ссылок. Например, в Blade-шаблонах:<a href="{{ route('dashboard.home') }}">Главная</a>.
Назначение маршрута:
-
Это главная страница административной панели.
-
Этот маршрут используется для рендеринга базового шаблона административной панели, который можно настроить и наполнить необходимым содержимым.
Установка laravel/ui
Для использования стандартных фронтенд-стилей и аутентификации в Laravel, необходимо установить пакет laravel/ui. Этот пакет предоставляет базовые компоненты, такие как аутентификация, страницы входа и регистрации, а также позволяет использовать фронтенд-фреймворки, такие как Bootstrap или Vue.js.
Установка пакета laravel/ui
Установите пакет laravel/ui через Composer:
После установки пакета, выполните команду для генерации фронтенд-скелета с использованием Bootstrap:
Команду нужно выполнять из корня проекта: /var/www/laravel-admin.
Это создаст необходимые файлы для интеграции Bootstrap в проект, включая шаблоны и стили.
Настройка аутентификации
После того, как вы установили и настроили laravel/ui, вы можете сгенерировать стандартные страницы аутентификации (входа и регистрации). Для этого выполните команду:
Согласитесь пересоздать файл Controller.php.
Эта команда создаст необходимые контроллеры, маршруты и представления для аутентификации:
- Контроллеры для регистрации и входа пользователей.
- Представления для страниц входа, регистрации и сброса пароля.
- Маршруты, которые обеспечат доступ к этим страницам.
Установка зависимостей
Установите необходимые JavaScript зависимости и скомпилируйте ресурсы с помощью npm:
В случае зависания установки запустите команду еще раз.
Удаление ненужных файлов и маршрутов
После установки пакета laravel/ui и настройки аутентификации, Laravel автоматически добавляет некоторые файлы и маршруты, которые не нужны в разработке админ-панели. Для очистки выполните следующие действия:
Контроллер HomeController
Контроллер HomeController.php, созданный по умолчанию, часто не используется, так как его функциональность заменяется вашими собственными контроллерами.
Для удаления выполните команду:
Маршрут home из routes/web.php
Маршрут для домашней страницы также создается автоматически:
Его можно удалить из файла routes/web.php, так как теперь маршрут перенаправления для аутентификации определяется константой HOME в RouteServiceProvider.
Обновите свойство $redirectTo
В файлах контроллеров, которые отвечают за аутентификацию и авторизацию, нужно заменить строку, указывающую путь для перенаправления после успешного входа/регистрации, на константу RouteServiceProvider::HOME.
- Найдите и откройте файлы контроллеров:
Эти файлы находятся в папке app/Http/Controllers/Auth/ и включают в себя следующие файлы:
ConfirmPasswordController.phpLoginController.phpRegisterController.phpResetPasswordController.phpVerificationController.php
- Импортируйте пространство имен в каждый контроллер с помощью оператора
use:
- Измените свойство
$redirectToв каждом из этих контроллеров.
По умолчанию в Laravel свойство $redirectTo будет равно строке /home:
Нужно заменить это на:
- Пример изменения для контроллера.
Пример для LoginController.php:
Для других контроллеров, где есть свойство $redirectTo нужно аналогичным образом изменить строку.
Просмотр страниц
После завершения всех предыдущих шагов, чтобы протестировать отображение страницы входа и регистрации, выполните следующие действия:
Очистите кэш приложения:
Команду php artisan нужно выполнять из корня проекта: /var/www/laravel-admin.
Откройте браузер и перейдите по следующим маршрутам:
http://<Публичный_IP-Адрес_Сервера>/login — для доступа к странице входа.

http://<Публичный_IP-Адрес_Сервера>/register — для регистрации нового пользователя.

Теперь базовая аутентификация в вашем проекте Laravel готова. Вы можете использовать её как основу для дальнейшей настройки и расширения.
Создание структуры файлов и папок для админ-панели
Создайте папку для шаблонов административной панели:
Создание базового шаблона
Создайте базовый шаблон resources/views/dashboard/layouts/master.blade.php:
Описание ключевых элементов шаблона:
-
{{ csrf_token() }}: Генерирует уникальный токен для защиты от CSRF-атак. -
@stack('style') и @stack('scripts'): Позволяют добавлять стили и скрипты из дочерних шаблонов через@push. -
@include('dashboard.layouts.nav'): Подключает Blade-шаблон с верхним меню. -
<script src="https://cdn.jsdelivr.net/npm/..."></script>: Для быстрого использования готовых стилей и компонентов на фронтенде, подключаем Bootstrap через CDN. -
{{ Session::get('global') }}: Выводит уведомления из переменнойglobalв сессии.
Создание вспомогательных шаблонов
Файл бокового меню resources/views/dashboard/layouts/sidebar.blade.php:
Файл верхнего меню resources/views/dashboard/layouts/nav.blade.php:
Создание основного шаблона для страниц
Теперь создайте файл resources/views/dashboard/app.blade.php:
Этот файл наследует базовый шаблон master.blade.php и задает уникальный контент для каждой страницы.
После завершения всех предыдущих шагов, выполните следующие действия, чтобы протестировать работу аутентификации:
Для очистки кэшей и временных данных выполните команду в корне проекта:
Теперь структура шаблонов для админ-панели завершена. Вы можете зарегистрировать первого пользователя, используя маршрут http://Публичный_IP-Адрес_Сервера/register.

После этого вы сможете авторизоваться.

Подготовка модели Post
Создание файлов модели и миграции
Создайте файл модели Post и файл миграцией (флаг -m) с помощью команды:
Laravel автоматически создаст два файла:
Файл модели app/Models/Post.php:
Файл миграции для таблицы database/migrations/YYYY_MM_DD_create_posts_table.php:
Файл миграции
Добавьте колонки title и content в файле database/migrations/YYYY_MM_DD_create_posts_table.php:
Вот так будет выглядеть файл миграции:
Выполните миграцию, чтобы создать таблицу в базе данных:
Файл модели Post
В файле app/Models/Post.php добавьте следующее свойство:
Вот как будет выглядеть модель Post:
-
$fillable— перечисляет поля, которые могут быть массово заполнены (mass assignment), например, черезPost::create(). -
HasFactory— трейт, позволяющий использовать фабрики для тестирования.
Создание ресурсного контроллера
Создайте файл контроллера для модели Post с помощью команды:
Laravel автоматически создаст файл контроллера app/Http/Controllers/Dashboard/PostController.php:
Что такое ресурсный контроллер?
Ресурсный контроллер (Resource Controller) в Laravel — это специальный тип контроллера, который автоматически создает пустые методы для стандартных операций CRUD (Create, Read, Update, Delete) над моделью данных. Это помогает упростить процесс создания маршрутов и контроллеров для управления ресурсами. Эти методы соответствуют RESTful-подходу и включают:
index— отображение списка записей.create— форма для создания новой записи.store— сохранение новой записи в базе данных.edit— форма для редактирования записи.update— обновление записи в базе данных.destroy— удаление записи.
Обновление кода контроллера
Удалите метод show и обновите код методов index, create, store, edit, update и destroy в файле контроллера app/Http/Controllers/Dashboard/PostController.php:
Добавление маршрутов
В файле routes/dashboard.php добавьте маршрут для ресурсного контроллера:
Этот маршрут автоматически создаст доступ к методам ресурсного контроллера, таким как index, create, store, и т. д.
Добавление ссылки в сайдбар
В файле resources/views/dashboard/layouts/sidebar.blade.php добавьте ссылку на управление постами:
Вот как будет выглядеть файл sidebar.blade.php:
Объяснение {{ route('posts.index')}}
Когда добавляете ресурсный маршрут:
Laravel автоматически создает несколько маршрутов для методов в контроллере PostController. Эти маршруты будут иметь следующие имена:
posts.index— для отображения списка постов (методindex).posts.create— для отображения формы создания поста (методcreate).posts.store— для сохранения нового поста в базе данных (методstore).posts.edit— для отображения формы редактирования поста (методedit).posts.update— для обновления поста в базе данных (методupdate).posts.destroy— для удаления поста (методdestroy).
Теперь в меню админки появится пункт «Записи», который ведёт на страницу управления постами.
Класс Request: создание и использование
Класс Request в Laravel отвечает за управление входящими HTTP-запросами. Он обеспечивает:
-
Централизацию валидации: Правила проверки данных определяются в одном месте, что повышает читаемость и упрощает поддержку.
-
Безопасность: Гарантирует, что только валидированные данные попадут в контроллер.
-
Логическую изоляцию: Убирает из контроллеров лишнюю логику, делая код более чистым и понятным.
Что делает класс Request?
-
Валидация данных: В классе
Requestвы описываете правила проверки данных. Например, требование, чтобы полеtitleбыло обязательным и содержало строку определенной длины. -
Авторизация: Класс позволяет определить, кто может выполнять запрос. Если авторизация в методе
authorizeвозвращаетfalse, запрос будет отклонен с кодом 403. -
Чистота данных: Метод
validated()возвращает только те данные, которые прошли проверку. Это предотвращает попадание нежелательных данных в базу или логику приложения. -
Изоляция логики: Все правила, связанные с запросом, изолируются в классе
Request, уменьшая сложность контроллера.
Создание кастомного класса Request
Чтобы создать кастомный класс Request для модели Post, выполните команду:
Laravel автоматически создаст файл app/Http/Requests/PostRequest.php:
Обновите методы authorize и rules:
В некоторых случаях полезно создавать два разных класса запроса для операций создания и обновления записи. Это может быть полезно, если правила валидации для этих операций различаются.
PostStoreRequest— используется для валидации данных при создании нового поста.PostUpdateRequest— используется для валидации данных при обновлении существующего поста.
Это позволяет настраивать разные правила валидации для этих операций. Например, при обновлении записи поле title может быть необязательным, если оно не изменяется, тогда как при создании оно обязательно.
Использование класса PostRequest в контроллере PostController
В контроллере app/Http/Controllers/Dashboard/PostController.php выполните следующие действия:
- Импортируйте пространство имен с помощью оператора
use:
- Обновите методы
storeиupdate, чтобы использовать новый классapp/Http/Requests/PostRequest.php:
Что делает $request->validated()?
Метод $request->validated() используется для получения только тех данных из запроса, которые прошли валидацию. Когда вы используете кастомный класс запроса, Laravel автоматически выполняет все проверки, описанные в методе rules() класса запроса. Например, может быть проверена обязательность полей или их соответствие заданному формату.
Метод validated() возвращает массив данных, которые успешно прошли валидацию, исключая любые поля, которые не прошли проверки. Это защищает от небезопасных данных и помогает избежать ошибок при обработке.
Пример:
- Если запрос содержит поле
title, которое не соответствует правилам валидации, Laravel прервет выполнение метода и вернет ошибку. Например, это произойдет, если поле пустое, хотя по правилам оно обязательно. - В случае успешной валидации
$request->validated()вернет только те поля, которые прошли все проверки, и их можно безопасно передать для создания или обновления записи в базе данных.
Создание Blade-шаблонов
Создайте папку для шаблонов модели Post:
Создайте шаблон для отображения всех элементов модели resources/views/dashboard/posts/index.blade.php:
Шаблон с формой для создания элементов resources/views/dashboard/posts/create.blade.php:
Шаблон для редактирования элемента модели resources/views/dashboard/posts/edit.blade.php:
Объяснение основных элементов шаблонов
@extends
@extends используется для наследования базового шаблона.
В данном случае шаблоны страниц index.blade.php, create.blade.php и edit.blade.php наследуют базовый шаблон master.blade.php, который определяет общий каркас страницы (шапка, меню, стили, скрипты и т.д.). Это позволяет переиспользовать общие части интерфейса и сократить дублирование кода.
@section
@section используется для заполнения секций, определенных в базовом шаблоне через @yield. Например, в базовом шаблоне master.blade.php определена секция @yield('content'), которая динамически заменяется содержимым дочерних шаблонов.
{{ old('title') }}
old() используется для получения ранее введенного значения формы после перезагрузки страницы. Это особенно полезно, если при отправке формы произошли ошибки валидации, и важно сохранить введенные пользователем данные.
@error
@error используется для вывода сообщений об ошибках валидации для определенного поля. Если поле title не прошло проверку, то внутри блока @error('title') будет отображено сообщение об ошибке.
Попробуйте создать и отредактировать несколько постов
После того как вы создадите шаблоны для отображения, создания и редактирования постов, не забудьте протестировать их в действии. Создайте несколько записей, используя форму на странице Создать запись, и попробуйте редактировать их через соответствующую форму.
Убедитесь, что все работает корректно: можно добавлять новые посты, а также редактировать уже существующие записи. Также проверьте, что сообщения об ошибках правильно отображаются при неверно заполненных полях.
Вывод записей в клиентской части
Создайте контроллер для обработки запросов:
Импортируйте пространство имен App\Models\Post и добавьте метод show в контроллере app/Http/Controllers/PostController.php для получения записей из базы данных:
Добавьте маршрут для отображения списка записей.
Откройте файл routes/web.php.
В этом файле находятся маршруты для клиентской части вашего приложения.
Используйте контроллер app/Http/Controllers/Controller.php для обработки запросов на главной странице:
Замените существующий маршрут главной страницы.
Было:
Стало:
Этот шаг настраивает главную страницу приложения для отображения записей из базы данных.
Создайте Blade-шаблон для вывода записей.
Создайте папку posts:
Создайте файл resources/views/posts/index.blade.php:
Теперь на главной странице http://localhost:8000/ вы сможете увидеть список записей с их заголовками и содержанием.

Для загрузки изображений к постам в облачное хранилище S3 воспользуйтесь инструкцией Интеграция Laravel с S3-хранилищем Timeweb Cloud.
Запустите свое приложение на облачном сервере
477 ₽/мес
657 ₽/мес
Заключение
Вы создали базовую админ-панель и клиентскую часть на Laravel! Ваш проект теперь включает:
- Админ-панель: Для управления записями через CRUD-интерфейс.
- Клиентскую часть: Для отображения списка записей пользователям.
- Гибкость и масштабируемость: Использование кастомных классов Request и моделей.
- Готовность к дальнейшему развитию: Вы можете добавлять новые функции, такие как категории, теги, поиск и фильтры.
