Урок 20: Пример создания блога на Yii 2. Проектирование БД, CRUD, теги, деплоймент.

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

Проектирование структуры базы данных

Первым шагом в разработке любого приложения является проектирование базы данных. Для блога нам понадобятся следующие сущности:

  • Статьи (заголовок, текст, автор, дата публикации).
  • Комментарии (текст, автор, дата, связь со статьей).
  • Теги (название тега, связь со статьями).

Таблицы и связи

  1. Таблица article:
    • id (первичный ключ)
    • title (заголовок)
    • content (текст статьи)
    • author_id (внешний ключ на пользователя)
    • created_at (дата создания)
  2. Таблица comment:
    • id
    • article_id (внешний ключ на статью)
    • author_name (имя автора)
    • content
    • created_at
  3. Таблица tag:
    • id
    • name (уникальное название тега)
  4. Связующая таблица article_tag (для связи многие-ко-многим):
    • article_id
    • tag_id

Создание миграций

Используем консоль Yii для генерации миграций. Пример для таблицы article:

bash
yii migrate/create create_article_table

Код миграции:

php
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'  
    );  
}

Аналогично создаем миграции для commenttag и article_tag. Не забудьте добавить внешние ключи!

Практическая задача:

  1. Создайте миграции для всех таблиц.
  2. Добавьте внешние ключи для связей между таблицами.

Реализация CRUD для статей и комментариев

CRUD (Create, Read, Update, Delete) это основа любого веб-приложения. В Yii 2 для его генерации удобно использовать Gii.

Генерация CRUD для статей

  1. Зайдите в Gii (/gii) и выберите «CRUD Generator».
  2. Укажите модель Article (если ее нет, то сначала создайте через «Model Generator»).
  3. Сгенерируйте контроллер и представления.

Пример контроллера ArticleController.php:

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:

php
public function getComments()  
{  
    return $this->hasMany(Comment::class, ['article_id' => 'id']);  
}

В представлении article/view.php:

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; ?>

Практическая задача:

  1. Сгенерируйте CRUD для комментариев через Gii.
  2. Добавьте форму создания комментария на странице просмотра статьи.

Добавление тегов и поиска

Реализация тегов

Для работы с тегами используем связь многие-ко-многим. В модель Article добавим связь:

php
public function getTags()  
{  
    return $this->hasMany(Tag::class, ['id' => 'tag_id'])  
        ->viaTable('article_tag', ['article_id' => 'id']);  
}

Пример формы добавления тегов к статье:

php
// В _form.php для статьи  
<?= $form->field($model, 'tagIds')->checkboxList(Tag::find()->select(['name', 'id'])->indexBy('id')->column()) ?>

Поиск по статьям

Реализуем поиск через форму. Создадим модель ArticleSearch:

php
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;  
    }  
}

Практическая задача:

  1. Добавьте теги к статьям через форму редактирования.
  2. Реализуйте поиск по заголовку и тегам.

Деплоймент блога на хостинг

После разработки приложения необходимо разместить его на хостинге. Рассмотрим основные шаги:

  1. Подготовка кода:
    • Удалите локальные настройки (например, config/db.php).
    • Добавьте .gitignore для исключения временных файлов.
  2. Настройка сервера:
    • Убедитесь, что на хостинге есть поддержка PHP 7.4+ и MySQL.
    • Настройте веб-сервер (Apache/Nginx) на работу с web/index.php.
  3. Загрузка файлов:
    • Используйте FTP или SSH для переноса файлов.
  4. Установка зависимостей:
    Выполните на сервере:

    bash
    composer install --no-dev
  5. Настройка окружения:
    Создайте файл config/db.php с параметрами хостинга:

    php
    return [  
        'class' => 'yii\db\Connection',  
        'dsn' => 'mysql:host=localhost;dbname=ваша_бд',  
        'username' => 'логин',  
        'password' => 'пароль',  
        'charset' => 'utf8',  
    ];
  6. Применение миграций:
    bash
    yii migrate/up --interactive=0

Практическая задача:

  1. Задеплойте приложение на любой хостинг (например, Beget или TimeWeb).
  2. Проверьте работоспособность блога.

Заключение

Поздравляю! Вы создали полноценный блог на Yii 2. Теперь вы умеете проектировать БД, работать с CRUD, реализовывать сложные связи и деплоить приложения.

Полный курс с уроками по Yii 2 для начинающих: https://max-gabov.ru/yii-2-dlya-nachinaushih

Поделиться статьей:
Поддержать автора блога

Поддержка автора осуществляется с помощью специальной формы ниже, предоставленной сервисом «ЮMoney». Все платёжные операции выполняются на защищённой странице сервиса, что обеспечивает их корректность и полную безопасность.

Персональные рекомендации
Оставить комментарий