Многие разработчики начинают свой путь в веб-программировании с создания блога. И это логично: блог — отличный способ попрактиковаться в работе с базой данных, шаблонами, формами и аутентификацией. А если вы уже знакомы с Yii2, то у вас есть все шансы сделать это быстро и красиво. В этой статье мы шаг за шагом создадим простой, но полноценный блог на Yii2: от установки фреймворка до вывода постов и комментариев.

Digital-студия WNDER

Почему именно Yii2?

Yii2 — это мощный PHP-фреймворк, который славится своей скоростью и удобством. Он следует парадигме MVC (Model-View-Controller), что помогает разделять логику и представление. Если вы раньше писали на чистом PHP, переход на Yii2 покажется вам глотком свежего воздуха. Всё структурировано, есть готовые инструменты для работы с БД, формами, валидацией и безопасностью.

Кроме того, Yii2 имеет отличную документацию и большое сообщество. Так что если вы застрянете, всегда найдёте ответ.

Установка и настройка

Первым делом нужно установить Yii2. Самый простой способ — использовать Composer. Если у вас его ещё нет, установите. Затем выполните команду:

composer create-project --prefer-dist yiisoft/yii2-app-basic blog

Эта команда создаст базовое приложение в папке blog. После установки настройте подключение к базе данных в файле config/db.php. Например, для MySQL:

return [
    'class' => 'yii\db\Connection',
    'dsn' => 'mysql:host=localhost;dbname=blog',
    'username' => 'root',
    'password' => '',
    'charset' => 'utf8',
];

Теперь можно запустить встроенный сервер: php yii serve и открыть в браузере http://localhost:8080. Вы увидите стандартную страницу приветствия Yii2.

Создаём базу данных и модели

Для блога нам понадобятся как минимум две таблицы: posts (посты) и comments (комментарии). Создадим их через миграции. В Yii2 миграции — это способ версионировать схему БД. Выполните:

php yii migrate/create create_posts_table

Затем откройте созданный файл в папке migrations и опишите таблицу:

public function safeUp()
{
    $this->createTable('posts', [
        'id' => $this->primaryKey(),
        'title' => $this->string()->notNull(),
        'content' => $this->text(),
        'created_at' => $this->integer(),
        'updated_at' => $this->integer(),
    ]);
}

Аналогично создайте миграцию для комментариев. Не забудьте выполнить php yii migrate, чтобы применить изменения.

Теперь создадим модели. В Yii2 модель — это класс, который представляет данные и правила их валидации. Используйте Gii (генератор кода) для быстрого создания моделей. Перейдите по адресу http://localhost:8080/gii и выберите Model Generator. Укажите таблицу posts и создайте модель Post. То же самое для Comment.

В модели Post добавьте связи с комментариями:

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

Контроллеры и представления

Теперь создадим контроллер для постов. В Yii2 контроллеры отвечают за обработку запросов и возврат ответа. Создайте файл controllers/PostController.php:

namespace app\controllers;

use Yii;
use app\models\Post;
use app\models\Comment;
use yii\web\Controller;
use yii\web\NotFoundHttpException;

class PostController extends Controller
{
    public function actionIndex()
    {
        $posts = Post::find()->orderBy('created_at DESC')->all();
        return $this->render('index', ['posts' => $posts]);
    }

    public function actionView($id)
    {
        $post = Post::findOne($id);
        if (!$post) {
            throw new NotFoundHttpException('Пост не найден');
        }
        $comment = new Comment();
        if ($comment->load(Yii::$app->request->post()) && $comment->save()) {
            return $this->refresh();
        }
        return $this->render('view', ['post' => $post, 'comment' => $comment]);
    }
}

Теперь создайте представления. В папке views/post создайте файл index.php для списка постов и view.php для просмотра одного поста с комментариями. В index.php выведите заголовки и ссылки:

<?php foreach ($posts as $post): ?>
    <h2><?= Html::a($post->title, ['view', 'id' => $post->id]) ?></h2>
    <p><?= $post->content ?></p>
<?php endforeach; ?>

В view.php добавьте форму для комментариев. Используйте ActiveForm:

<?php $form = ActiveForm::begin(); ?>
    <?= $form->field($comment, 'content')->textarea() ?>
    <div class="form-group">
        <?= Html::submitButton('Отправить', ['class' => 'btn btn-primary']) ?>
    </div>
<?php ActiveForm::end(); ?>
Правило: Всегда добавляйте валидацию в модели. Например, для комментария укажите, что поле content обязательно и имеет минимальную длину. Это защитит от спама и пустых сообщений.

Аутентификация и админка

Чтобы добавлять посты, нужна админка. В Yii2 есть готовый модуль для аутентификации. Можно использовать базовый шаблон с пользователями, но мы сделаем проще: создадим CRUD для постов через Gii. Перейдите в Gii и выберите CRUD Generator. Укажите модель Post и контроллер PostController (но осторожно: он перезапишет наш контроллер). Лучше создать отдельный контроллер AdminPostController в папке controllers/admin.

Для ограничения доступа используйте фильтр AccessControl:

public function behaviors()
{
    return [
        'access' => [
            'class' => AccessControl::className(),
            'only' => ['create', 'update', 'delete'],
            'rules' => [
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
            ],
        ],
    ];
}

Теперь только авторизованные пользователи смогут управлять постами.

Внешний вид и полезные мелочи

По умолчанию Yii2 использует Bootstrap 3. Вы можете подключить свои стили или использовать готовые темы. Не забудьте про ЧПУ (человекопонятные URL). В конфиге config/web.php включите компонент urlManager:

'urlManager' => [
    'enablePrettyUrl' => true,
    'showScriptName' => false,
    'rules' => [
        'post/<id:\d+>' => 'post/view',
    ],
],

Также добавьте пагинацию для списка постов. В контроллере:

$query = Post::find()->orderBy('created_at DESC');
$pagination = new Pagination(['totalCount' => $query->count(), 'pageSize' => 5]);
$posts = $query->offset($pagination->offset)->limit($pagination->limit)->all();

И в представлении выведите LinkPager.

Что в итоге?

Мы создали простой блог на Yii2: с постами, комментариями, админкой и красивыми URL. Конечно, это только основа. Вы можете добавить теги, категории, загрузку изображений, RSS-ленту и многое другое. Главное — вы получили рабочий каркас и поняли, как всё устроено внутри.

Yii2 — отличный выбор для быстрого старта. Не бойтесь экспериментировать и читать документацию. Удачи в разработке!

Лайфхак: Используйте Gii для генерации кода — это экономит кучу времени. Но всегда проверяйте сгенерированный код и адаптируйте под свои нужды.
Компонент Назначение
Model Работа с данными, валидация
View Отображение данных
Controller Обработка запросов

Студия WNDER