Это заключительный урок нашего курса по Yii 2 и сегодня мы соберем все полученные знания в один проект, создадим полноценный блог с нуля. Мы разберем проектирование базы данных, реализуем CRUD для статей и комментариев, добавим теги и поиск, а в конце задеплоим приложение на хостинг.
Проектирование структуры базы данных
Первым шагом в разработке любого приложения является проектирование базы данных. Для блога нам понадобятся следующие сущности:
- Статьи (заголовок, текст, автор, дата публикации).
- Комментарии (текст, автор, дата, связь со статьей).
- Теги (название тега, связь со статьями).
Таблицы и связи
- Таблица
article:id(первичный ключ)title(заголовок)content(текст статьи)author_id(внешний ключ на пользователя)created_at(дата создания)
- Таблица
comment:idarticle_id(внешний ключ на статью)author_name(имя автора)contentcreated_at
- Таблица
tag:idname(уникальное название тега)
- Связующая таблица
article_tag(для связи многие-ко-многим):article_idtag_id
Создание миграций
Используем консоль Yii для генерации миграций. Пример для таблицы article:
yii migrate/create create_article_table
Код миграции:
public function safeUp() { $this->createTable('article', [ 'id' => $this->primaryKey(), 'title' => $this->string()->notNull(), 'content' => $this->text()->notNull(), 'author_id' => $this->integer(), 'created_at' => $this->timestamp()->defaultExpression('CURRENT_TIMESTAMP'), ]); // Добавляем индекс для author_id $this->createIndex( 'idx-article-author_id', 'article', 'author_id' ); }
Аналогично создаем миграции для comment, tag и article_tag. Не забудьте добавить внешние ключи!
Практическая задача:
- Создайте миграции для всех таблиц.
- Добавьте внешние ключи для связей между таблицами.
Реализация CRUD для статей и комментариев
CRUD (Create, Read, Update, Delete) это основа любого веб-приложения. В Yii 2 для его генерации удобно использовать Gii.
Генерация CRUD для статей
- Зайдите в Gii (
/gii) и выберите «CRUD Generator». - Укажите модель
Article(если ее нет, то сначала создайте через «Model Generator»). - Сгенерируйте контроллер и представления.
Пример контроллера ArticleController.php:
namespace app\controllers; use Yii; use app\models\Article; use yii\web\Controller; use yii\web\NotFoundHttpException; class ArticleController extends Controller { public function actionIndex() { $articles = Article::find()->all(); return $this->render('index', ['articles' => $articles]); } public function actionView($id) { $article = Article::findOne($id); if (!$article) { throw new NotFoundHttpException('Статья не найдена.'); } return $this->render('view', ['article' => $article]); } }
Добавление комментариев
Для комментариев реализуем отдельный контроллер. Также добавим связь между моделями Article и Comment:
В модели Article:
public function getComments() { return $this->hasMany(Comment::class, ['article_id' => 'id']); }
В представлении article/view.php:
<?php foreach ($article->comments as $comment): ?> <div class="comment"> <h5><?= Html::encode($comment->author_name) ?></h5> <p><?= Html::encode($comment->content) ?></p> </div> <?php endforeach; ?>
Практическая задача:
- Сгенерируйте CRUD для комментариев через Gii.
- Добавьте форму создания комментария на странице просмотра статьи.
Добавление тегов и поиска
Реализация тегов
Для работы с тегами используем связь многие-ко-многим. В модель Article добавим связь:
public function getTags() { return $this->hasMany(Tag::class, ['id' => 'tag_id']) ->viaTable('article_tag', ['article_id' => 'id']); }
Пример формы добавления тегов к статье:
// В _form.php для статьи
<?= $form->field($model, 'tagIds')->checkboxList(Tag::find()->select(['name', 'id'])->indexBy('id')->column()) ?>
Поиск по статьям
Реализуем поиск через форму. Создадим модель ArticleSearch:
namespace app\models; use yii\base\Model; use yii\data\ActiveDataProvider; class ArticleSearch extends Article { public $tagIds; public function rules() { return [ [['title', 'content', 'tagIds'], 'safe'], ]; } public function search($params) { $query = Article::find()->joinWith('tags'); $dataProvider = new ActiveDataProvider([ 'query' => $query, ]); if (!($this->load($params) && $this->validate())) { return $dataProvider; } $query->andFilterWhere(['like', 'title', $this->title]) ->andFilterWhere(['like', 'content', $this->content]) ->andFilterWhere(['tag.id' => $this->tagIds]); return $dataProvider; } }
Практическая задача:
- Добавьте теги к статьям через форму редактирования.
- Реализуйте поиск по заголовку и тегам.
Деплоймент блога на хостинг
После разработки приложения необходимо разместить его на хостинге. Рассмотрим основные шаги:
- Подготовка кода:
- Удалите локальные настройки (например,
config/db.php). - Добавьте
.gitignoreдля исключения временных файлов.
- Удалите локальные настройки (например,
- Настройка сервера:
- Убедитесь, что на хостинге есть поддержка PHP 7.4+ и MySQL.
- Настройте веб-сервер (Apache/Nginx) на работу с
web/index.php.
- Загрузка файлов:
- Используйте FTP или SSH для переноса файлов.
- Установка зависимостей:
Выполните на сервере:composer install --no-dev
- Настройка окружения:
Создайте файлconfig/db.phpс параметрами хостинга:return [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=ваша_бд', 'username' => 'логин', 'password' => 'пароль', 'charset' => 'utf8', ];
- Применение миграций:
yii migrate/up --interactive=0
Практическая задача:
- Задеплойте приложение на любой хостинг (например, Beget или TimeWeb).
- Проверьте работоспособность блога.
Заключение
Поздравляю! Вы создали полноценный блог на Yii 2. Теперь вы умеете проектировать БД, работать с CRUD, реализовывать сложные связи и деплоить приложения.
Полный курс с уроками по Yii 2 для начинающих: https://max-gabov.ru/yii-2-dlya-nachinaushih
Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.


