[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:
180
app/Core/Model.php
Normal file
180
app/Core/Model.php
Normal 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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user