Как вы добавляете или получаете переменные, используя Yii :: $ app-> user-> что-то?
Я НЕ хочу получать их через identity
! Я хочу сделать конкретные доступными через user
!
Например, я хочу получить текущее имя пользователя и имя пользователя:
\Yii::$app->user->username
или
\Yii::$app->user->name
Я отвечаю на этот вопрос Q & A Style
. Это означает, что я отвечаю на свой вопрос. Я уже знаю, как и надеюсь, что это поможет другим получить больше от Yii2. Я планирую сделать несколько видеоуроков в ближайшее время, и некоторые вещи, приведенные здесь для справки, помогут мне быстро получить немного и сделать.
В то время как другие темы здесь, на SO, предлагают решение chincy hack, или просто получить его через Yii::$app->user->identity
, я покажу вам, как это сделать правильно. Вы можете сгибать Yii2 по своему желанию, фактически расширяя все!
Обычно я работаю в «расширенном» приложении, но я просто использую «основное» приложение в качестве ссылки для всех. Я предполагаю, что те, кто использует «продвинутое» приложение, знают различия и понимают пространства имен.
Namespace Crash Course: в основном у вас есть namespace app\path\to
. Здесь находится файл. Например, у вас есть ContactForm.php, расположенный в каталоге корневых файлов приложения, поэтому это пространство имен – это app\models
. В расширенном режиме у вас есть несколько приложений (frontend & backend), поэтому корень приложения отличается, поэтому у вас есть frontend
как один корень приложения, а backend
как другой. Каталог моделей в расширенном приложении находится в «frontend / models», а пространство имен – frontend\models
. – Поэтому везде, где вы видите «приложение» в пространстве имен, вы можете заменить его frontend
или backend
для «продвинутого» шаблона.
Во-первых, нам нужно изменить конфигурационный файл нашего приложения, чтобы переопределить класс компонента User по умолчанию. Я оставлю все, что не связано, поэтому вы определяете свой identityClass
код, я просто не показываю его. Мы просто добавляем, не заменяя конфигурацию. Кроме того, где я показываю frontend/something
, то же самое можно сделать для backend/something
. Я просто не повторяюсь снова и снова …
Basic ( config/web.php
) config/web.php
Advanced ( frontend/config/main.php
)
'components' => [ 'user' => [ 'class' => 'app\components\User', // extend User component ], ],
Помните: если вы используете расширенный шаблон, замените app
frontend
или backend
!
Я также хочу отметить, что вам нужно будет создать каталог «components», если вы этого еще не сделали. Это – то, где многие люди добавляют свои собственные Классы. Является ли это вашим собственным вспомогательным классом или расширяет базовый компонент 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 ?>
Если все хорошо, и у вас есть значения в таблице пользователя для имени и имени пользователя, они должны быть напечатаны на странице 🙂