PHP Academy · Урок

Шаблонный подход: отделение логики от представления

Переносите бизнес-логику в файлы PHP и сохраняйте чистоту HTML-шаблонов

Урок 4 из 413 шагов

«Шаблонный подход: отделение логики от представления» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.

Зачем отделять логику от представления

Смешивание запросов к базе данных, бизнес-логики и HTML в одном файле приводит к следующему:

  • Запутанный код, который трудно читать
  • Сложности с тестированием и повторным использованием логики
  • Ошибки безопасности, когда проверка пропускается

Решение: размещайте каждую задачу в своём слое.

Простой шаблон

Сначала выполните всю логику PHP, а затем выведите HTML:

<?php
// --- LOGIC (top) ---
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user   = getUserById($userId);
if (!$user) {
    http_response_code(404);
    require '404.php';
    exit;
}
$pageTitle = 'Profile: ' . $user['name'];

// --- VIEW (bottom) ---
require 'layout/header.php';
?>
<main>
    <h1><?= htmlspecialchars($user['name']) ?></h1>
</main>
<?php require 'layout/footer.php'; ?>

Разделение файлов контроллера и представления

Разделите код на файл контроллера и файл представления:

// profile.php (controller)
<?php
require 'config.php';
$userId = (int) ($_GET['id'] ?? 0);
$user   = getUserById($userId);
$posts  = getPostsByUser($userId);

if (!$user) { require '404.php'; exit; }

require 'views/profile.view.php';

// views/profile.view.php (view) — only HTML and echoes
// No DB calls allowed here!

Подготовка данных представления

Отформатируйте все данные в слое логики перед передачей в представление:

<?php
$user = getUserById($id);

$viewData = [
    'userName'   => htmlspecialchars($user['name']),
    'avatarUrl'  => $user['avatar'] ?? '/default.png',
    'joinedDate' => date('F Y', strtotime($user['created_at'])),
    'isAdmin'    => in_array('admin', $user['roles']),
];

extract($viewData);  // Makes $userName, $avatarUrl, etc.
require 'views/profile.view.php';

Шаблон с функцией

Оберните отображение представления в функцию для более удобного повторного использования:

<?php
function render(string $view, array $data = []): void {
    extract($data);  // Create variables from array
    require __DIR__ . '/views/' . $view . '.php';
}

// Usage:
render('profile', [
    'name'   => $user['name'],
    'email'  => $user['email'],
]);

Движок шаблонов с буферизацией вывода

Отобразите шаблон и верните его в виде строки:

<?php
function renderToString(string $view, array $data = []): string {
    extract($data);
    ob_start();
    require __DIR__ . '/views/' . $view . '.php';
    return ob_get_clean();
}

$html = renderToString('email/welcome', ['name' => 'Alice']);
mail($to, 'Welcome!', $html, 'Content-Type: text/html');

Когда использовать движок шаблонов

Для простых сайтов встроенная система шаблонов PHP подходит хорошо. Рассмотрите Twig или Blade, если:

  • Вам нужно автоматическое экранирование по умолчанию
  • Дизайнерам необходимо редактировать шаблоны без знания PHP
  • Вам нужны наследование шаблонов и макросы
  • В проекте много представлений и он разрастается

Пример Twig

Twig (используемый Symfony) предоставляет понятный синтаксис с автоматическим экранированием:

<?php
// After: composer require twig/twig
$loader = new Twig\Loader\FilesystemLoader('/templates');
$twig   = new Twig\Environment($loader, ['cache' => '/tmp/twig']);

echo $twig->render('profile.html.twig', [
    'user'  => $user,
    'posts' => $posts,
]);

// profile.html.twig:
// <h1>{{ user.name }}</h1>  -- auto-escaped by default

Структура каталогов MVC

Минимальная структура MVC для проектов на чистом PHP:

project/
  controllers/
    UserController.php   -- handles request, calls model
  models/
    User.php             -- database queries
  views/
    users/
      profile.php        -- display only, no logic
  public/
    index.php            -- front controller (router)

Шаблон фронт-контроллера

Направьте все запросы через единую точку входа:

<?php
// public/index.php (front controller)
require __DIR__ . '/../vendor/autoload.php';

$uri    = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$routes = require '../routes.php';

if (isset($routes[$uri])) {
    [$controller, $action] = $routes[$uri];
    (new $controller)->$action();
} else {
    http_response_code(404);
    require '../views/404.php';
}

Принцип единственной ответственности

У каждого файла должна быть только одна причина для изменения:

  • Модель: изменяется только при изменении структуры данных или логики запросов
  • Контроллер: изменяется только при изменении логики обработки запросов
  • Представление: изменяется только при изменении интерфейса или структуры страницы

Так каждый компонент проще независимо тестировать и сопровождать.

Быстрая проверка

Каково главное преимущество отделения логики PHP от кода представления HTML?

Итоги: шаблон проектирования

Главные выводы:

  • Сначала выполняйте всю логику, затем выводите HTML
  • Разделяйте код на файлы контроллера и представления
  • Используйте функцию render() с extract()
  • Буферизация вывода захватывает отрисованный HTML
  • Рассмотрите Twig или Blade для крупных проектов
  • Фронт-контроллер направляет все запросы обработчикам
Можно начать бесплатно

Изучай PHP с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
49
Уроки
195

Часто задаваемые вопросы

Урок «Шаблонный подход: отделение логики от представления» бесплатный?

Да — полный текст урока «Шаблонный подход: отделение логики от представления» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.

Чему я научусь в уроке «Шаблонный подход: отделение логики от представления»?

Переносите бизнес-логику в файлы PHP и сохраняйте чистоту HTML-шаблонов Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать PHP Academy?

Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Шаблонный подход: отделение логики от представления»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке PHP Academy?

Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Теги PHP и синтаксис встраивания
  2. Динамический HTML с циклами PHP
  3. Подключение и обязательное подключение файлов
  4. Шаблонный подход: отделение логики от представления
← Назад к PHP Academy