- Создано ядро MVC: App, Router, Controller, Model, View, Database - Созданы модели: User, Product, Category, Cart, Order - Созданы контроллеры: Home, Auth, Product, Cart, Order, Page, Admin - Созданы layouts и partials для представлений - Добавлены все views для страниц - Настроена маршрутизация с чистыми URL - Обновлена конфигурация Docker и Apache для mod_rewrite - Добавлена единая точка входа public/index.php
149 lines
3.8 KiB
PHP
149 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Core;
|
|
|
|
/**
|
|
* Controller - базовый класс контроллера
|
|
*/
|
|
abstract class Controller
|
|
{
|
|
/**
|
|
* Данные для передачи в представление
|
|
*/
|
|
protected array $data = [];
|
|
|
|
/**
|
|
* Отрендерить представление
|
|
*/
|
|
protected function view(string $view, array $data = [], string $layout = 'main'): void
|
|
{
|
|
echo View::render($view, $data, $layout);
|
|
}
|
|
|
|
/**
|
|
* Отрендерить представление без layout
|
|
*/
|
|
protected function viewPartial(string $view, array $data = []): void
|
|
{
|
|
echo View::render($view, $data, null);
|
|
}
|
|
|
|
/**
|
|
* Вернуть JSON ответ
|
|
*/
|
|
protected function json(array $data, int $statusCode = 200): void
|
|
{
|
|
http_response_code($statusCode);
|
|
header('Content-Type: application/json; charset=utf-8');
|
|
echo json_encode($data, JSON_UNESCAPED_UNICODE);
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Редирект на другой URL
|
|
*/
|
|
protected function redirect(string $url): void
|
|
{
|
|
header("Location: {$url}");
|
|
exit;
|
|
}
|
|
|
|
/**
|
|
* Получить текущего пользователя из сессии
|
|
*/
|
|
protected function getCurrentUser(): ?array
|
|
{
|
|
if (!isset($_SESSION['isLoggedIn']) || $_SESSION['isLoggedIn'] !== true) {
|
|
return null;
|
|
}
|
|
|
|
return [
|
|
'id' => $_SESSION['user_id'] ?? null,
|
|
'email' => $_SESSION['user_email'] ?? '',
|
|
'full_name' => $_SESSION['full_name'] ?? '',
|
|
'phone' => $_SESSION['user_phone'] ?? '',
|
|
'city' => $_SESSION['user_city'] ?? '',
|
|
'is_admin' => $_SESSION['isAdmin'] ?? false,
|
|
'login_time' => $_SESSION['login_time'] ?? null
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Проверить, авторизован ли пользователь
|
|
*/
|
|
protected function isAuthenticated(): bool
|
|
{
|
|
return isset($_SESSION['isLoggedIn']) && $_SESSION['isLoggedIn'] === true;
|
|
}
|
|
|
|
/**
|
|
* Проверить, является ли пользователь администратором
|
|
*/
|
|
protected function isAdmin(): bool
|
|
{
|
|
return $this->isAuthenticated() && isset($_SESSION['isAdmin']) && $_SESSION['isAdmin'] === true;
|
|
}
|
|
|
|
/**
|
|
* Требовать авторизацию
|
|
*/
|
|
protected function requireAuth(): void
|
|
{
|
|
if (!$this->isAuthenticated()) {
|
|
$redirect = urlencode($_SERVER['REQUEST_URI']);
|
|
$this->redirect("/login?redirect={$redirect}");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Требовать права администратора
|
|
*/
|
|
protected function requireAdmin(): void
|
|
{
|
|
if (!$this->isAdmin()) {
|
|
$this->redirect('/login');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Получить POST данные
|
|
*/
|
|
protected function getPost(?string $key = null, $default = null)
|
|
{
|
|
if ($key === null) {
|
|
return $_POST;
|
|
}
|
|
return $_POST[$key] ?? $default;
|
|
}
|
|
|
|
/**
|
|
* Получить GET данные
|
|
*/
|
|
protected function getQuery(?string $key = null, $default = null)
|
|
{
|
|
if ($key === null) {
|
|
return $_GET;
|
|
}
|
|
return $_GET[$key] ?? $default;
|
|
}
|
|
|
|
/**
|
|
* Установить flash-сообщение
|
|
*/
|
|
protected function setFlash(string $type, string $message): void
|
|
{
|
|
$_SESSION['flash'][$type] = $message;
|
|
}
|
|
|
|
/**
|
|
* Получить flash-сообщение
|
|
*/
|
|
protected function getFlash(string $type): ?string
|
|
{
|
|
$message = $_SESSION['flash'][$type] ?? null;
|
|
unset($_SESSION['flash'][$type]);
|
|
return $message;
|
|
}
|
|
}
|
|
|