qu1styy / php_practik
practik
Requires
- php: ^7.4 | ^8.0
- illuminate/database: 13.x-dev
- illuminate/events: 13.x-dev
- nikic/fast-route: ^2.0@dev
- qu1styy/collect: dev-main
- qu1styy/validator: dev-main
Requires (Dev)
None
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-09-18 18:55:29 UTC
README
Учебное PHP-приложение для управления пользователями, кафедрами и дисциплинами. Проект демонстрирует построение небольшого MVC-приложения без полноценного фреймворка: собственные маршрутизация, контейнер приложения, провайдеры, middleware, аутентификация, HTML-представления и JSON API.
Возможности
- регистрация, вход и выход пользователя;
- просмотр и редактирование профиля;
- управление пользователями;
- управление кафедрами и дисциплинами;
- связи между пользователями, кафедрами и дисциплинами;
- авторизация веб-части через сессию;
- авторизация API через Bearer-токен;
- CSRF-защита POST-запросов веб-части;
- обработка JSON-тела API-запросов;
- HTML-рендеринг через PHP-шаблоны и общий layout;
- JSON-ответы для API;
- SQL-дамп MySQL с таблицами и демонстрационными данными.
Стек
- PHP: 7.4+ согласно
composer.json; для текущих dev-зависимостей рекомендуется PHP 8.x. - База данных: MySQL.
- ORM: Eloquent из
illuminate/database. - Маршрутизация:
nikic/fast-route. - Зависимости:
illuminate/events,qu1styy/validator,qu1styy/collect. - Frontend: PHP-шаблоны и Bootstrap 5.3, подключаемый через CDN.
- Web-сервер: Apache с
mod_rewriteлибо совместимый сервер, настроенный наpublic/.
Архитектура
.
├── app/
│ ├── Controller/ Контроллеры Site и Api
│ ├── Middlewares/ Авторизация, CSRF, JSON, trim и очистка спецсимволов
│ ├── Model/ Eloquent-модели User, Post, Department и др.
│ └── Providers/ Инициализация настроек, маршрутов, БД и авторизации
├── config/ Конфигурация приложения, путей и подключения к БД
├── core/
│ ├── bootstrap.php Создание приложения и подключение Composer
│ └── Src/ Ядро: Application, Route, Request, View, Auth и Settings
├── public/
│ └── index.php Front controller — единственная публичная точка входа
├── routes/
│ ├── web.php HTML-маршруты
│ └── api.php API-маршруты с префиксом `/api`
├── views/
│ ├── layouts/ Общий layout
│ └── site/ Страницы сайта и формы
├── бе/
│ ├── pkpkrges_m4 (1).sql SQL-дамп схемы и данных
│ └── ... Методические материалы и заметки
├── composer.json
└── .htaccess
Как проходит запрос
public/index.php запускает core/bootstrap.php, который подключает Composer и создаёт Src\Application. Провайдеры из config/app.php загружают настройки, подключают Eloquent, инициализируют аутентификацию и регистрируют маршруты. RouteProvider выбирает веб-маршруты или API-маршруты по префиксу /api, после чего Src\Route запускает middleware и вызывает метод контроллера.
Веб-контроллеры возвращают представления из views/site через Src\View и layout views/layouts/main.php. API-контроллер Controller\Api возвращает JSON; защищённый endpoint /api/profile проверяет заголовок Authorization: Bearer ....
Установка
Требования
- PHP 8.x;
- Composer;
- MySQL 8.x или совместимый сервер;
- Apache с включённым
mod_rewriteлибо эквивалентная настройка маршрутизации; - расширения PHP для MySQL и работы с JSON/сессиями.
1. Клонирование и зависимости
git clone https://github.com/Qu1styy/php_practik.git
cd php_practik
composer install
vendor/ не хранится в репозитории и создаётся командой composer install.
2. Создание базы данных
Создайте базу данных с именем pkpkrges_m4, затем импортируйте SQL-дамп:
mysql -u root -p pkpkrges_m4 < "бе/pkpkrges_m4 (1).sql"
Либо импортируйте файл через phpMyAdmin. Дамп содержит таблицы users, roles, genders, departments, disciplines и таблицы связей между ними.
3. Настройка подключения
Параметры базы данных находятся в config/db.php:
return [ 'driver' => 'mysql', 'host' => 'database', 'database' => 'pkpkrges_m4', 'username' => 'root', 'password' => 'change-me', ];
Перед запуском замените host, username и password на значения своей среды. Не коммитьте реальные пароли в репозиторий; в текущем проекте конфигурация подключения хранится в PHP-файле, поэтому для production рекомендуется вынести секреты в переменные окружения.
4. Настройка пути приложения
В config/path.php параметр root задаёт путь приложения относительно домена:
'root' => 'php_practik',
Если проект доступен из корня домена, установите пустое значение:
'root' => '',
Если приложение размещено в /php_practik, оставьте значение php_practik.
Запуск
Вариант 1: Apache
Укажите корень проекта как DocumentRoot или разместите проект в каталоге Apache. В репозитории есть два правила .htaccess: корневое перенаправляет запросы в public/, а public/.htaccess передаёт неизвестные файлы в public/index.php.
Откройте в браузере:
http://localhost/php_practik/
Вариант 2: встроенный сервер PHP
Для локальной проверки можно запустить встроенный сервер с публичным каталогом:
php -S localhost:8000 -t public
При таком варианте config/path.php обычно должен содержать:
'root' => '',
Откройте http://localhost:8000/.
Веб-маршруты
| Метод | Путь | Назначение |
|---|---|---|
GET |
/ |
Главная страница, доступна авторизованным пользователям |
GET, POST |
/signup |
Регистрация |
GET, POST |
/login |
Вход |
GET |
/logout |
Выход |
GET |
/profile |
Профиль пользователя |
GET, POST |
/profile/edit |
Редактирование профиля |
GET, POST |
/users |
Список пользователей |
GET, POST |
/users/add |
Добавление пользователя |
GET, POST |
/user |
Карточка пользователя |
GET, POST |
/departments |
Список кафедр |
GET, POST |
/department |
Карточка кафедры |
GET, POST |
/department/add |
Добавление кафедры |
GET, POST |
/disciplines |
Список дисциплин |
GET, POST |
/discipline |
Карточка дисциплины |
GET, POST |
/discipline/add |
Добавление дисциплины |
Большинство маршрутов требует сессионной авторизации и при отсутствии входа перенаправляет пользователя на /login.
API
Все API-маршруты имеют префикс /api.
| Метод | Endpoint | Авторизация | Назначение |
|---|---|---|---|
GET |
/api/ |
Нет | Возвращает список записей Post в JSON |
POST |
/api/echo |
Нет | Возвращает переданные данные |
POST |
/api/auth |
Нет | Проверяет login и password, возвращает API-токен |
GET |
/api/profile |
Bearer | Возвращает профиль текущего пользователя |
Пример получения токена:
curl -X POST http://localhost:8000/api/auth \\ -H 'Content-Type: application/json' \\ -d '{"login":"ivanov","password":"your-password"}'
Пример запроса к защищённому endpoint:
curl http://localhost:8000/api/profile \\ -H 'Authorization: Bearer YOUR_TOKEN'
Важные замечания по безопасности
Проект предназначен для учебного и демонстрационного использования. Перед публикацией в production необходимо как минимум:
- заменить демонстрационные учётные данные и не хранить их в Git;
- заменить MD5 в
Model\Userнаpassword_hash()иpassword_verify(); - проверить коды HTTP-ответов для ошибок API;
- отключить вывод полного объекта исключения в
public/index.php; - вынести настройки БД и другие секреты в переменные окружения;
- проверить права доступа к административным операциям;
- добавить тесты для маршрутов, middleware, авторизации и валидации;
- проверить кодировку импортируемого SQL-файла и корректность данных перед загрузкой.
Лицензия
Проект распространяется под лицензией MIT, согласно composer.json.