Yii2 - 如何从 Yii::$app->user 获取当前用户名或名称?
Yii2 - How to get the current username or name from Yii::$app->user?
如何使用 Yii::$app->user->something
添加或获取变量?
我不想让他们通过 identity
。我想通过 user
.
访问特定的
比如我想获取当前登录用户的用户名和姓名:
\Yii::$app->user->username
或
\Yii::$app->user->name
虽然 SO 上的其他主题提供了一个 chincy hack 解决方案,或者只是通过 Yii::$app->user->identity
获取它,但我将向您展示如何正确地做到这一点。您可以通过虚拟扩展一切来让 Yii2 随心所欲!
我平时都是在"advanced" app里面工作,但是我打算直接用"basic" app作为大家的参考。我假设那些使用 "advanced" 应用程序的人知道这些差异并了解名称空间。
命名空间速成课程: 在基础上,您有 namespace app\path\to
。这是文件所在的位置。例如,您在应用程序根 models
目录中有 ContactForm.php,因此它的命名空间是 app\models
。在高级中,您有多个应用程序(前端和后端),因此应用程序根目录不同,因此您将 frontend
作为一个应用程序根目录,而 backend
作为另一个应用程序根目录。高级应用程序中的模型目录位于 "frontend/models",其命名空间为 frontend\models
。 -- 所以你在命名空间中看到 "app" 的任何地方,对于 "advanced" 模板,你可以用 frontend
或 backend
替换它。
解决方案
首先,我们需要修改应用程序的配置文件以覆盖默认用户组件的 class。我会省略任何不相关的内容,所以你保持你的 identityClass
定义,我只是不显示它。我们只是添加而不是替换配置。此外,在我显示 frontend/something
的地方,也可以对 backend/something
执行相同的操作。我只是不想一遍又一遍地重复...
基本 (config/web.php
) - 或 - 高级 (frontend/config/main.php
)
'components' => [
'user' => [
'class' => 'app\components\User', // extend User component
],
],
记住:如果您使用的是高级模板,请将 app
替换为 frontend
或 backend
!
我还想指出,如果您还没有创建 "components" 目录,则需要这样做。这是许多人添加他们的自定义 类 的地方。无论是您自己的助手 class,还是扩展 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
必须是数据库用户 table!
中的有效列名
所以现在我们可以在我们的控制器、视图中的任何地方使用它了。让我们来测试一下。在 views/site/index.php
中,将此添加到页面底部:
<?= \Yii::$app->user->name ?>
<?= \Yii::$app->user->username ?>
如果一切正常,并且您在用户 table 中有名称和用户名的值,它们应该打印到页面上:)
如何使用 Yii::$app->user->something
添加或获取变量?
我不想让他们通过 identity
。我想通过 user
.
比如我想获取当前登录用户的用户名和姓名:
\Yii::$app->user->username
或
\Yii::$app->user->name
虽然 SO 上的其他主题提供了一个 chincy hack 解决方案,或者只是通过 Yii::$app->user->identity
获取它,但我将向您展示如何正确地做到这一点。您可以通过虚拟扩展一切来让 Yii2 随心所欲!
我平时都是在"advanced" app里面工作,但是我打算直接用"basic" app作为大家的参考。我假设那些使用 "advanced" 应用程序的人知道这些差异并了解名称空间。
命名空间速成课程: 在基础上,您有 namespace app\path\to
。这是文件所在的位置。例如,您在应用程序根 models
目录中有 ContactForm.php,因此它的命名空间是 app\models
。在高级中,您有多个应用程序(前端和后端),因此应用程序根目录不同,因此您将 frontend
作为一个应用程序根目录,而 backend
作为另一个应用程序根目录。高级应用程序中的模型目录位于 "frontend/models",其命名空间为 frontend\models
。 -- 所以你在命名空间中看到 "app" 的任何地方,对于 "advanced" 模板,你可以用 frontend
或 backend
替换它。
解决方案
首先,我们需要修改应用程序的配置文件以覆盖默认用户组件的 class。我会省略任何不相关的内容,所以你保持你的 identityClass
定义,我只是不显示它。我们只是添加而不是替换配置。此外,在我显示 frontend/something
的地方,也可以对 backend/something
执行相同的操作。我只是不想一遍又一遍地重复...
基本 (config/web.php
) - 或 - 高级 (frontend/config/main.php
)
'components' => [
'user' => [
'class' => 'app\components\User', // extend User component
],
],
记住:如果您使用的是高级模板,请将 app
替换为 frontend
或 backend
!
我还想指出,如果您还没有创建 "components" 目录,则需要这样做。这是许多人添加他们的自定义 类 的地方。无论是您自己的助手 class,还是扩展 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
必须是数据库用户 table!
所以现在我们可以在我们的控制器、视图中的任何地方使用它了。让我们来测试一下。在 views/site/index.php
中,将此添加到页面底部:
<?= \Yii::$app->user->name ?>
<?= \Yii::$app->user->username ?>
如果一切正常,并且您在用户 table 中有名称和用户名的值,它们应该打印到页面上:)