Yii2 - 如何从Yii :: $ app-> user获取当前用户名或名称?

Wad*_*ade 3 php yii yii2 yii2-user

你如何使用变量添加或获取变量Yii::$app->user->something

我不想让他们通过identity.我想通过特定的方式进行访问user.

例如,我想获取当前登录用户的用户名和名称:

\Yii::$app->user->username
Run Code Online (Sandbox Code Playgroud)

要么

\Yii::$app->user->name
Run Code Online (Sandbox Code Playgroud)

Wad*_*ade 13

虽然SO上的其他主题提供了一个chincy hack解决方案,或者只是简单地获取它Yii::$app->user->identity,我将向您展示如何正确地完成它.您可以通过虚拟扩展所有内容来弯曲Yii2!

我通常在"高级"应用程序中工作,但我将使用"基本"应用程序作为每个人的参考.我假设那些使用"高级"应用程序的人知道差异并理解命名空间.

命名空间速成课程:基本上,你有namespace app\path\to.这是文件所在的位置.例如,您有位于app根models目录中的ContactForm.php ,因此它的命名空间是app\models.在高级中,您有多个应用程序(前端和后端),因此应用程序根目录不同,因此您拥有frontend一个应用程序根目录和backend另一个应用程序根目录.高级应用程序中的models目录位于"frontend/models",它的命名空间是frontend\models.-所以,只要看到"应用程序"中的命名空间,你可以将其替换为frontendbackend为"先进"的模板.


首先,我们需要修改应用程序的配置文件以覆盖默认的User组件类.我会遗漏任何不相关的东西,所以你保持你的identityClass定义,我只是没有表现出来.我们只是添加,而不是替换配置.此外,在我展示的地方frontend/something,可以做同样的事情backend/something.我不会一遍又一遍地重复......

基本(config/web.php) - 或 - 高级(frontend/config/main.php)

'components' => [
    'user' => [
        'class' => 'app\components\User', // extend User component
    ],
],
Run Code Online (Sandbox Code Playgroud)

请记住:如果您使用的是高级模板,请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;
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:username并且name必须是数据库用户表中的有效列名!

所以现在我们可以在我们的控制器,视图,任何地方使用它.让我们测试一下.在views/site/index.php,将其添加到页面底部:

<?= \Yii::$app->user->name ?>
<?= \Yii::$app->user->username ?>
Run Code Online (Sandbox Code Playgroud)

如果一切正常,并且您在用户表中有名称和用户名的值,则应将它们打印到页面上:)

  • 为什么直接从`Yii::$app-&gt;user-&gt;identity` 获取数据不是正确的方法?有什么缺点? (2认同)