Если вы когда-нибудь пытались создать свой сайт с нуля, то наверняка сталкивались с проблемой: как удобно добавлять статьи, менять страницы и управлять всем этим без танцев с бубном. Готовая CMS — это хорошо, но иногда хочется чего-то своего, гибкого и понятного. Именно тут на помощь приходит Yii2 — мощный PHP-фреймворк, который позволяет собрать систему управления контентом (CMS) под ваши нужды. В этой статье я расскажу, как это сделать без лишней боли, на практических примерах.

Digital-студия WNDER

Почему Yii2, а не что-то ещё?

Yii2 — это как швейцарский нож в мире PHP. Он быстрый, безопасный и при этом не навязывает жёстких правил. Вы можете строить структуру так, как удобно вам, а не так, как задумал разработчик фреймворка. Для CMS это особенно важно, потому что каждый проект уникален.

Вот несколько причин выбрать Yii2:

  • Gii — генератор кода. Позволяет создавать модели, контроллеры и виды в пару кликов. Экономит часы рутины.
  • RBAC — управление ролями. Встроенная система прав доступа. Можно настроить, кто может редактировать контент, а кто только смотреть.
  • Расширяемость. Модульная структура позволяет разбивать функционал на независимые части, которые легко поддерживать.
  • Активная запись (Active Record). Работа с базой данных становится интуитивной, без написания сложных SQL-запросов.

Но главное — Yii2 не заставляет вас использовать стандартные шаблоны. Вы можете сделать админку такой, какой хотите её видеть, а не какой её навязывает система.

Проектируем структуру: модули — наше всё

Представьте, что вы строите дом. Если вы зальёте весь бетон в одну кучу, получится хаос. Точно так же и в программировании: если весь код писать в одном месте, через месяц вы сами не разберётесь, где что лежит. В Yii2 для этого придуманы модули — это такие «комнаты» в вашем приложении, каждая из которых отвечает за свою задачу.

Для CMS нам понадобятся как минимум три модуля:

МодульЗа что отвечаетПримеры функционала
contentУправление статьями, страницами, менюСоздание, редактирование, удаление записей
userПользователи и их ролиРегистрация, авторизация, профиль
adminАдминистративная панельДашборд, настройки, статистика

Каждый модуль — это отдельная папка с собственными контроллерами, моделями и видами. Это позволяет легко добавлять новые функции, не затрагивая существующий код.

Например, чтобы создать модуль content, достаточно выполнить команду в консоли:

php yii gii/module --moduleID=content --moduleClass=app\modules\content\Module

После этого в папке modules/content появятся стандартные файлы. Вы можете смело их редактировать.

Создаём модель и миграцию для контента

Модель в Yii2 — это класс, который работает с таблицей в базе данных. Для контента нам понадобится таблица, где будут храниться статьи, страницы, новости — в общем, всё, что вы хотите публиковать.

Сначала создадим миграцию — это как чертёж для таблицы. Выполните в консоли:

php yii migrate/create create_content_table

В появившемся файле миграции опишем структуру:

public function up()
{
    $this->createTable('content', [
        'id' => $this->primaryKey(),
        'title' => $this->string(255)->notNull(),
        'body' => $this->text(),
        'status' => $this->smallInteger()->defaultValue(1),
        'created_at' => $this->timestamp()->defaultExpression('CURRENT_TIMESTAMP'),
        'updated_at' => $this->timestamp()->defaultExpression('CURRENT_TIMESTAMP')->append('ON UPDATE CURRENT_TIMESTAMP'),
    ]);
}

public function down()
{
    $this->dropTable('content');
}

Теперь создадим модель Content с помощью Gii. Это сгенерирует файл модели, который мы потом подправим под свои нужды.

php yii gii/model --tableName=content --modelClass=Content

В модели добавим правила валидации и связи. Например, чтобы контент мог иметь автора:

public function rules()
{
    return [
        [['title'], 'required'],
        [['title'], 'string', 'max' => 255],
        [['body'], 'string'],
        [['status'], 'integer'],
    ];
}

public function getUser()
{
    return $this->hasOne(User::class, ['id' => 'user_id']);
}

Не забудьте добавить поле user_id в таблицу и связать его с пользователем.

Контроллер и виды: как отображать контент

Контроллер — это посредник между моделью и видом. Он получает запрос от пользователя, обращается к модели за данными и передаёт их в вид для отображения. Для нашего модуля content создадим контроллер, который будет показывать список статей и одну статью по запросу.

namespace app\modules\content\controllers;

use Yii;
use yii\web\Controller;
use app\modules\content\models\Content;

class DefaultController extends Controller
{
    // Действие для списка статей
    public function actionIndex()
    {
        $contents = Content::find()->where(['status' => 1])->all();
        return $this->render('index', ['contents' => $contents]);
    }

    // Действие для просмотра одной статьи
    public function actionView($id)
    {
        $content = Content::findOne($id);
        if (!$content) {
            throw new \yii\web\NotFoundHttpException('Статья не найдена.');
        }
        return $this->render('view', ['content' => $content]);
    }
}

В папке views/default создадим два файла: index.php и view.php. В index.php выведем заголовки статей:

А в view.php — полный текст статьи:

title) ?>

body)) ?>

Обратите внимание на использование htmlspecialchars — это защита от XSS-атак. Никогда не выводите данные без экранирования.

Безопасность и производительность: лайфхаки

Теперь, когда базовый функционал готов, давайте поговорим о том, как сделать вашу CMS надёжной и быстрой. Без этого любой сайт превратится в тыкву.

Правило золотого экранирования: Всегда экранируйте данные, выводимые в представлениях. Используйте htmlspecialchars или помощник Html::encode(). Это защитит от межсайтового скриптинга.

Вот несколько советов, которые я накопил за годы работы:

  • Используйте кэширование. Yii2 поддерживает разные типы кэша — файловый, memcached, redis. Кэшируйте тяжелые запросы, чтобы не грузить базу каждый раз.
  • Оптимизируйте запросы. Используйте жадную загрузку (with()) для связей, чтобы избежать проблемы N+1 запросов.
  • Включите CSRF-защиту. В формах используйте ActiveForm — он автоматически добавляет токен.
  • Следите за правами доступа. Настройте RBAC, чтобы не давать лишних привилегий.

Заключение: что в итоге

Мы разобрали, как создать простую, но рабочую систему управления контентом на Yii2. Мы прошли путь от проектирования модулей до создания контроллеров и видов, а также обсудили важные аспекты безопасности. Это лишь верхушка айсберга — вы можете добавлять категории, теги, загрузку изображений, редактор текста и многое другое.

Главное — не бояться экспериментировать и использовать мощные инструменты Yii2. Начните с малого, постепенно усложняя функционал. И помните: хорошая CMS — это та, которой удобно пользоваться вам и вашим клиентам.

Надеюсь, эта статья была полезной. Если вы хотите, чтобы ваш проект сделали профессионалы, обращайтесь в Digital-студию WNDER — мы с радостью поможем!

Студия WNDER