Пользовательские данные в yii2 через свойства \Yii::$app

При использовании систем RBAC возникает вопрос о хранениии и получении доступа к данным пользователя в приложении (например: дата рождения, место работы, ФИО, стаж и др.).

В работе будем использовать webvimark/user-management.

Для примера, создадим таблицы core_teacher и core_learner и AR-модели:

$this->createTable('core_teacher', [
    'id' => $this->primaryKey(),
    'user_id' => $this->integer()->notNull()->comment('id пользователя'),
    'name' => $this->string()->notNull()->comment('ФИО'),
    'description' => $this->string()->notNull()->comment('Описание'),
    'rating' => $this->float()->defaultValue(0)->comment('Рейтинг')
]);

$this->createTable('core_learner', [
    'id' => $this->primaryKey(),
    'user_id' => $this->integer()->notNull()->comment('id пользователя'),
    'name' => $this->string()->notNull()->comment('ФИО'),
    'class' => $this->string()->comment('Класс')
]);

Добавим 2 модуля, через CRUD:

  • модуль для учителя (личный кабинет учителя)
  • модуль для ученика (личный кабинет ученика)

Добавим компонент TeacherComponent:

<?php

namespace app\modules\teacher\components;

use app\models\AR\CoreTeacher;
use yii\base\Component;

class TeacherComponent extends Component
{
    public $teacher = null;

    public function __construct(array $config = [])
    {
        $this->teacher = CoreTeacher::findOne(['user_id' => \Yii::$app->user->id]);

        parent::__construct($config);
    }

    /**
     * @return CoreTeacher
     */
    public function get()
    {
        return $this->teacher;
    }

    /**
     * @return int
     */
    public function getId()
    {
        return $this->teacher->id;
    }

}

и зарегистрируем его в config.php:

$config = [
    ...
    'bootstrap' => [
        'log',
        'teacher'
    ],
    ...
    'components' => [
        'teacher' => [
            'class' => 'app\modules\teacher\components\TeacherComponent',
        ],
    ...

В app\modules\teacher\Module.php добавим проверку:

if (!\Yii::$app->teacher->get()) {
    throw new NotFoundHttpException('Доступ к модулю запрещен');
}

Аналогичные действия производим с компонентом LearnerComponent.

Теперь в любом месте программы мы можем обратиться к данным teacher следующим образом:

$teacher = \Yii::$app->teacher->get();

Также, если определить роли и разрешения, можно после авторизации на сайте автоматически редиректить пользователя в нужный модуль:

'components' => [
        ...
        'user' => [
            'class' => 'webvimark\modules\UserManagement\components\UserConfig',
            'on afterLogin' => function($event) {
                if (\webvimark\modules\UserManagement\models\User::hasPermission('teacher_cabinet', false)) {
                    Yii::$app->response->redirect('/teacher');
                    Yii::$app->end();
                }
                if (\webvimark\modules\UserManagement\models\User::hasPermission('learner_cabinet', false)) {
                    Yii::$app->response->redirect('/learner');
                    Yii::$app->end();
                }
            }
        ],
        ...
{{ message }}

{{ 'Comments are closed.' | trans }}