Yii2 - Как получить текущее имя пользователя или имя пользователя из Yii::$app->пользователь?


Как вы добавляете или получаете переменные, используя Yii::$приложение->пользователь->что-то?

Я не хочу, чтобы они проходили через identity! Я хочу сделать конкретные из них доступными через user!

Например, я хочу получить имя пользователя и имя текущего зарегистрированного пользователя:

\Yii::$app->user->username

Или

\Yii::$app->user->name

УВЕДОМЛЕНИЕ

Я отвечаю на этот вопрос Q & A Style. Это означает, что я отвечаю на свой собственный вопрос. Я уже знаю, как это сделать, и надеюсь, что это поможет другим получить больше из Yii2. Я планирую в ближайшее время сделать несколько видеоуроков, и изложение здесь некоторых вещей для справки поможет мне быстро кое-что сделать.

Author: Wade, 2016-07-16

1 answers

В то время как другие темы здесь, на SO, предлагают простое решение для взлома или просто получить его через Yii::$app->user->identity, я покажу вам, как это сделать правильно. Вы можете подчинить Yii2 своей воле, практически расширив все!

Обычно я работаю в "продвинутом" приложении, но я собираюсь просто использовать "базовое" приложение в качестве ориентира для всех. Я предполагаю, что те, кто использует "продвинутое" приложение, знают различия и понимают пространства имен.

Ускоренный курс пространства имен: В базовый, у вас есть namespace app\path\to. Именно здесь находится файл. Например, у вас есть ContactForm.php расположен в корневом каталоге приложения models, поэтому его пространство имен app\models. В advanced у вас есть несколько приложений (внешний интерфейс и серверная часть), поэтому корневой каталог приложения отличается, поэтому у вас есть frontend в качестве одного корневого каталога приложения и backend в качестве другого. Каталог моделей в расширенном приложении находится в разделе "интерфейс/модели", и его пространство имен frontend\models. -- Поэтому везде, где вы видите "приложение" в пространстве имен, вы можете заменить его на frontend или backend для шаблон "расширенный".


Решение

Во-первых, нам нужно изменить файл конфигурации нашего приложения, чтобы переопределить класс пользовательского компонента по умолчанию. Я опущу все, что не связано, поэтому вы сохраняете свой identityClass определенным, я просто не показываю это. Мы просто добавляем, а не заменяем конфигурацию. Кроме того, там, где я показываю frontend/something, то же самое можно сделать для backend/something. Я просто не собираюсь повторять и то, и другое снова и снова...

Базовый (config/web.php) -или - Продвинутый (frontend/config/main.php)

'components' => [
    'user' => [
        'class' => 'app\components\User', // extend User component
    ],
],

Помните: Если вы используете расширенный шаблон, замените app на frontend или backend!

Я также хочу отметить, что вам нужно будет создать каталог "компоненты", если вы этого еще не сделали. Именно здесь многие люди добавляют свои пользовательские классы. Будь то ваш собственный вспомогательный класс или расширение базового компонента Yii (например, расширение yii\web\Controller).

Создайте новый файл в своем каталоге components с именем User.php. В этом файле поместите следующий код:

<?php
namespace app\components;

use Yii;

/**
 * Extended yii\web\User
 *
 * This allows us to do "Yii::$app->user->something" by adding getters
 * like "public function getSomething()"
 *
 * So we can use variables and functions directly in `Yii::$app->user`
 */
class User extends \yii\web\User
{
    public function getUsername()
    {
        return \Yii::$app->user->identity->username;
    }

    public function getName()
    {
        return \Yii::$app->user->identity->name;
    }
}

Примечание: username и name должны быть допустимыми именами столбцов в таблице пользователей вашей базы данных!

Так что теперь мы можем использовать это в нашем контроллере, представлении, где угодно.. Давайте проверим это. В views/site/index.php добавьте это внизу страницы:

<?= \Yii::$app->user->name ?>
<?= \Yii::$app->user->username ?>

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

 10
Author: Wade, 2016-07-16 20:34:29