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

Почему Yii2 подходит для корпоративного портала

Yii2 — это PHP-фреймворк, который создан для крупных проектов. У него есть встроенные инструменты для управления пользователями, правами доступа и базами данных. Всё, что нужно для портала, уже есть в коробке. Например, модуль RBAC (Role-Based Access Control) позволяет гибко настраивать, кто что видит. А Gii — генератор кода — ускоряет разработку в разы.

Вот основные плюсы Yii2 для портала:

  • Быстрая разработка — готовые компоненты и шаблоны.
  • Безопасность — защита от XSS, CSRF и SQL-инъекций из коробки.
  • Масштабируемость — портал выдержит тысячи пользователей.
  • Сообщество — много документации и готовых расширений.

С чего начать: установка и настройка

Первый шаг — установка Yii2. Я рекомендую использовать шаблон advanced, потому что он разделяет фронтенд и бэкенд. Для портала это удобно: админка отдельно, пользовательская часть отдельно.

Установите Yii2 через Composer. Вот команда:

composer create-project --prefer-dist yiisoft/yii2-app-advanced portal

После установки выполните инициализацию:

cd portal
php init

Выберите режим Development (0). Затем настройте базу данных в файле common/config/main-local.php. Пример:

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

Не забудьте создать базу данных в MySQL. После этого примените миграции:

php yii migrate

Всё готово. Теперь у вас есть базовая структура портала.

Управление пользователями и ролями

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

Для этого используем RBAC. Сначала настройте компонент authManager в конфиге:

// common/config/main.php
'components' => [
    'authManager' => [
        'class' => 'yii\rbac\DbManager',
    ],
],

Затем выполните миграцию для RBAC:

php yii migrate --migrationPath=@yii/rbac/migrations

Теперь создадим роли через консольную команду. Сделайте файл console/controllers/RbacController.php:

namespace console\controllers;

use Yii;
use yii\console\Controller;

class RbacController extends Controller
{
    public function actionInit()
    {
        $auth = Yii::$app->authManager;

        // Создаем роли
        $admin = $auth->createRole('admin');
        $manager = $auth->createRole('manager');
        $employee = $auth->createRole('employee');

        $auth->add($admin);
        $auth->add($manager);
        $auth->add($employee);

        // Создаем разрешения
        $viewReports = $auth->createPermission('viewReports');
        $viewReports->description = 'Просмотр отчетов';
        $auth->add($viewReports);

        $editUsers = $auth->createPermission('editUsers');
        $editUsers->description = 'Редактирование пользователей';
        $auth->add($editUsers);

        // Назначаем разрешения ролям
        $auth->addChild($manager, $viewReports);
        $auth->addChild($admin, $editUsers);
        $auth->addChild($admin, $manager);

        // Назначаем роль пользователю (например, с ID 1)
        $auth->assign($admin, 1);

        echo "Roles created successfully.\n";
    }
}

Запустите команду:

php yii rbac/init

Теперь у вас есть базовая система ролей. В контроллерах можно проверять права:

if (Yii::$app->user->can('viewReports')) {
    // показать отчет
}
Правило: Никогда не назначайте разрешения напрямую пользователям. Всегда используйте роли. Это упростит поддержку, когда в компании появится 100 сотрудников.

Создание модуля новостей и документов

Сердце портала — контент. Новости, документы, объявления. Создадим модуль новостей. Yii2 поддерживает модули, которые изолируют функционал. Это удобно для больших проектов.

Создайте папку frontend/modules/news. Внутри — файл Module.php:

namespace frontend\modules\news;

class Module extends \yii\base\Module
{
    public $controllerNamespace = 'frontend\modules\news\controllers';

    public function init()
    {
        parent::init();
    }
}

Добавьте модуль в конфиг frontend/config/main.php:

'modules' => [
    'news' => [
        'class' => 'frontend\modules\news\Module',
    ],
],

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

php yii gii/model --tableName=news --modelClass=News --ns=frontend\modules\news\models

Создайте миграцию:

php yii gii/crud --modelClass=frontend\modules\news\models\News --controllerClass=frontend\modules\news\controllers\DefaultController

Вот пример контроллера для списка новостей:

namespace frontend\modules\news\controllers;

use yii\web\Controller;
use frontend\modules\news\models\News;

class DefaultController extends Controller
{
    public function actionIndex()
    {
        $news = News::find()->orderBy(['created_at' => SORT_DESC])->all();
        return $this->render('index', ['news' => $news]);
    }
}

Аналогично можно сделать модуль для документов с загрузкой файлов. Используйте поведение UploadBehavior для удобства.

Компонент Назначение Пример
Модуль Изолирует функционал (новости, документы) frontend/modules/news
Модель Работа с данными из БД News.php
Контроллер Обработка запросов DefaultController.php
Представление Отображение HTML views/default/index.php

Интеграция поиска и уведомлений

Корпоративный портал должен быть удобным. Два ключевых элемента — поиск и уведомления. Поиск можно сделать через Sphinx или Elasticsearch, но для начала хватит простого LIKE-запроса. Вот пример поиска по новостям:

public function actionSearch($query)
{
    $news = News::find()
        ->where(['like', 'title', $query])
        ->orWhere(['like', 'content', $query])
        ->all();
    return $this->render('search', ['news' => $news]);
}

Для уведомлений используем WebSocket или просто email. В Yii2 есть встроенная почта через SwiftMailer. Настройте её в конфиге:

'components' => [
    'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'smtp.gmail.com',
            'username' => 'your@email.com',
            'password' => 'password',
            'port' => '587',
            'encryption' => 'tls',
        ],
    ],
],

Отправка уведомления при создании новости:

Yii::$app->mailer->compose()
    ->setTo('all@company.com')
    ->setSubject('Новая новость: ' . $model->title)
    ->setTextBody($model->content)
    ->send();
Лайфхак: Для уведомлений в реальном времени используйте Pusher или Ratchet. Но для начала хватит и email. Не усложняйте проект без необходимости.

Что в итоге

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

Главный совет: используйте готовые расширения из Composer. Например, для загрузки файлов — kartik-v/yii2-fileinput, для виджетов — kartik-v/yii2-widgets. Это сэкономит часы работы.

Студия WNDER