3

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

我不想让他们通过identity。我想通过user.

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

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

或者

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

1 回答 1

14

虽然这里关于 SO 的其他主题提供了一个 chincy hack 解决方案,或者只是简单地获取它Yii::$app->user->identity,但我将向您展示如何正确地做到这一点。您可以通过虚拟扩展所有内容来让 Yii2 随心所欲!

我通常在“高级”应用程序中工作,但我将只使用“基本”应用程序作为每个人的参考。我假设那些使用“高级”应用程序的人知道差异并了解名称空间。

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


解决方案

首先,我们需要修改应用程序的配置文件以覆盖默认用户组件的类。我会省略任何不相关的内容,所以你保持你的identityClass定义,我只是没有展示它。我们只是添加而不是替换配置。此外,在我展示frontend/something的地方,也可以对backend/something. 我只是不会一遍又一遍地重复......

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

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

请记住:如果您使用的是高级模板,请替换appfrontendbackend

我还想指出,如果您还没有创建“组件”目录,则需要创建。这是许多人添加自定义类的地方。无论是你自己的帮助类,还是扩展一个基本的 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 ?>

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

于 2016-07-16T20:34:29.370 回答