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.-所以,只要看到"应用程序"中的命名空间,你可以将其替换为frontend或backend为"先进"的模板.
首先,我们需要修改应用程序的配置文件以覆盖默认的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)
如果一切正常,并且您在用户表中有名称和用户名的值,则应将它们打印到页面上:)