[MVC] Полная миграция на MVC архитектуру

- Создано ядро 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
This commit is contained in:
kirill.khorkov
2026-01-03 11:48:14 +03:00
parent 3f257120fa
commit d2c15ec37f
53 changed files with 8650 additions and 30 deletions

180
app/Core/Model.php Normal file
View File

@@ -0,0 +1,180 @@
<?php
namespace App\Core;
/**
* Model - базовый класс модели
*/
abstract class Model
{
protected Database $db;
protected string $table = '';
protected string $primaryKey = 'id';
public function __construct()
{
$this->db = Database::getInstance();
}
/**
* Найти запись по первичному ключу
*/
public function find(int $id): ?array
{
$sql = "SELECT * FROM {$this->table} WHERE {$this->primaryKey} = ?";
return $this->db->queryOne($sql, [$id]);
}
/**
* Получить все записи
*/
public function all(?string $orderBy = null): array
{
$sql = "SELECT * FROM {$this->table}";
if ($orderBy) {
$sql .= " ORDER BY {$orderBy}";
}
return $this->db->query($sql);
}
/**
* Найти записи по условию
*/
public function where(array $conditions, ?string $orderBy = null): array
{
$where = [];
$params = [];
foreach ($conditions as $column => $value) {
$where[] = "{$column} = ?";
$params[] = $value;
}
$sql = "SELECT * FROM {$this->table} WHERE " . implode(' AND ', $where);
if ($orderBy) {
$sql .= " ORDER BY {$orderBy}";
}
return $this->db->query($sql, $params);
}
/**
* Найти одну запись по условию
*/
public function findWhere(array $conditions): ?array
{
$where = [];
$params = [];
foreach ($conditions as $column => $value) {
$where[] = "{$column} = ?";
$params[] = $value;
}
$sql = "SELECT * FROM {$this->table} WHERE " . implode(' AND ', $where) . " LIMIT 1";
return $this->db->queryOne($sql, $params);
}
/**
* Создать новую запись
*/
public function create(array $data): ?int
{
$columns = array_keys($data);
$placeholders = array_fill(0, count($data), '?');
$sql = sprintf(
"INSERT INTO %s (%s) VALUES (%s) RETURNING %s",
$this->table,
implode(', ', $columns),
implode(', ', $placeholders),
$this->primaryKey
);
$stmt = $this->db->getConnection()->prepare($sql);
$stmt->execute(array_values($data));
return (int) $stmt->fetchColumn();
}
/**
* Обновить запись
*/
public function update(int $id, array $data): bool
{
$set = [];
$params = [];
foreach ($data as $column => $value) {
$set[] = "{$column} = ?";
$params[] = $value;
}
$params[] = $id;
$sql = sprintf(
"UPDATE %s SET %s WHERE %s = ?",
$this->table,
implode(', ', $set),
$this->primaryKey
);
return $this->db->execute($sql, $params);
}
/**
* Удалить запись
*/
public function delete(int $id): bool
{
$sql = "DELETE FROM {$this->table} WHERE {$this->primaryKey} = ?";
return $this->db->execute($sql, [$id]);
}
/**
* Подсчитать количество записей
*/
public function count(array $conditions = []): int
{
$sql = "SELECT COUNT(*) FROM {$this->table}";
$params = [];
if (!empty($conditions)) {
$where = [];
foreach ($conditions as $column => $value) {
$where[] = "{$column} = ?";
$params[] = $value;
}
$sql .= " WHERE " . implode(' AND ', $where);
}
$stmt = $this->db->getConnection()->prepare($sql);
$stmt->execute($params);
return (int) $stmt->fetchColumn();
}
/**
* Выполнить произвольный SQL запрос
*/
protected function query(string $sql, array $params = []): array
{
return $this->db->query($sql, $params);
}
/**
* Выполнить произвольный SQL запрос и получить одну запись
*/
protected function queryOne(string $sql, array $params = []): ?array
{
return $this->db->queryOne($sql, $params);
}
/**
* Выполнить произвольный SQL запрос (INSERT/UPDATE/DELETE)
*/
protected function execute(string $sql, array $params = []): bool
{
return $this->db->execute($sql, $params);
}
}