Если вы когда-нибудь пытались создать свой сайт с нуля, то наверняка сталкивались с проблемой: как удобно добавлять статьи, менять страницы и управлять всем этим без танцев с бубном. Готовая CMS — это хорошо, но иногда хочется чего-то своего, гибкого и понятного. Именно тут на помощь приходит Yii2 — мощный PHP-фреймворк, который позволяет собрать систему управления контентом (CMS) под ваши нужды. В этой статье я расскажу, как это сделать без лишней боли, на практических примерах.
Почему 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 — полный текст статьи:
= htmlspecialchars($content->title) ?>
= nl2br(htmlspecialchars($content->body)) ?>
Обратите внимание на использование htmlspecialchars — это защита от XSS-атак. Никогда не выводите данные без экранирования.
Безопасность и производительность: лайфхаки
Теперь, когда базовый функционал готов, давайте поговорим о том, как сделать вашу CMS надёжной и быстрой. Без этого любой сайт превратится в тыкву.
Вот несколько советов, которые я накопил за годы работы:
- Используйте кэширование. Yii2 поддерживает разные типы кэша — файловый, memcached, redis. Кэшируйте тяжелые запросы, чтобы не грузить базу каждый раз.
- Оптимизируйте запросы. Используйте жадную загрузку (with()) для связей, чтобы избежать проблемы N+1 запросов.
- Включите CSRF-защиту. В формах используйте ActiveForm — он автоматически добавляет токен.
- Следите за правами доступа. Настройте RBAC, чтобы не давать лишних привилегий.
Заключение: что в итоге
Мы разобрали, как создать простую, но рабочую систему управления контентом на Yii2. Мы прошли путь от проектирования модулей до создания контроллеров и видов, а также обсудили важные аспекты безопасности. Это лишь верхушка айсберга — вы можете добавлять категории, теги, загрузку изображений, редактор текста и многое другое.
Главное — не бояться экспериментировать и использовать мощные инструменты Yii2. Начните с малого, постепенно усложняя функционал. И помните: хорошая CMS — это та, которой удобно пользоваться вам и вашим клиентам.
Надеюсь, эта статья была полезной. Если вы хотите, чтобы ваш проект сделали профессионалы, обращайтесь в Digital-студию WNDER — мы с радостью поможем!



