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" ?>
→ Ссылка