PHP - сайт - переписать код на понятный
Дано, старый сайт написанный в процедурном стиле в том числе и работа с MYSQL.
Задача переписать и привести всё это в более понятный организованный код.
Общая мысль, сделать для начала для MYSQL какую-то функцию чтобы она обрабатывала все запросы, как бы из одного места, а не так как на сайте они раскиданы по файлам, то есть сделать что-то общего обработчика запросов ?
Что посоветуете ? Какие ещё могут быть моменты упрощения ?
Ответы (1 шт):
Мысль правильная, но такое "одно место" должно быть не одно. Совсем в одном файле держать все запросы будет банально неудобно. Обычно их группируют по той сущности, с которой они работают - пользователь, товар, новость и так далее. Традиционно хотя и неправильно, такие файлы именуют "моделями".
Кроме этого очень желательно и весь HTML, выводимый на одной странице, так же вынести в отдельный файл.
И в итоге у вас получится архитектура MVC:
- Запросы поользователей обрабатывает "контроллер" - тот файл, который у вас сейчас делает вообще всё. Сейчас же он будет получать и обязательно валидировать входящие данные, передавать их в "модель", получать ответ и инклюдить файл с HTML
- Обработкой данных занимается "модель". В простейшем варианте это просто файл с функциями, которые возвращают нужные данные.
- Выводом данных занимается файл с HTML, "представление" (view).
Так у вас получится аккуратная и расширяемая структура, с которой будет уже проще переходить на "настоящий" MVC, на основе фреймворка
Очень хорошо это всё расписано в книге Джона Дакетта PHP&HTML
Очень условно страница отображения одной новости может выглядеть так
<?php
require __DIR__.'init.php';
require __DIR__.'model/news.php';
if (isset($_GET['id'])) {
$id = $_GET['id'];
} else {
http_response_code(404);
die();
}
$data = news_get_one($db, $id);
if (!$data) {
http_response_code(404);
die();
}
require __DIR__.'template/news/item.php'
соответственно в model/news.php будут функции для получения/добавления данных, связанных с новостями, и в том числе
function news_get_one($db, $id) {
$sql = "SELECT * FROM news WHERE id=?";
return $db->execute_query($sql, [$id])->fetch_all(MYSQLI_ASSOC);
}
Подробнее про работу с БД в РНР можно почитать здесь
ну а в template/news/item.php будет что-то вроде
<?php require __DIR__."../layout_top.php" ?>
<h1><?= htmlspecialchars($data['title'])?></h1>
<div>
<?= nl2br(htmlspecialchars($data['content']))?></h1>
</div>
<?php require __DIR__."../layout_bottom.php" ?>