How do you add, or get, variables using Yii::$app->user->something
?
I don't want to get them through identity
. I want to make specific ones accessible through user
.
For example, I want to get the current logged in user's username and name:
\Yii::$app->user->username
or
\Yii::$app->user->name
While other topics here on SO offer a chincy hack solution, or to simply fetch it through
Yii::$app->user->identity
, I am going to show you how to do it properly. You can bend Yii2 to your will, by virtually extending everything!I normally work in the "advanced" app, but I am going to just use the "basic" app as a reference for everyone. I assume those who are using the "advanced" app know the differences and understand namespaces.
Namespace Crash Course: In basic, you have
namespace app\path\to
. This is where the file is located. For example, you have ContactForm.php located in the app rootmodels
directory, so it's namespace isapp\models
. In advanced, you have multiple apps (frontend & backend), so the app root is different, thus you havefrontend
as one app root, andbackend
as another. The models directory in the advanced app is at "frontend/models" and it's namespace isfrontend\models
. -- So anywhere you see "app" in the namespace, you can replace it withfrontend
orbackend
for the "advanced" template.Solution
First, we need to modify our app's config file to override the default User component's class. I will leave out anything not related, so you keep your
identityClass
defined, I just am not showing it. We are simply adding to, not replacing, the config. Also, where I showfrontend/something
, the same can be done forbackend/something
. I just am not going to repeat both over and over again...Basic (
config/web.php
) -or- Advanced (frontend/config/main.php
)Remember: If you are using the advanced template, replace
app
withfrontend
orbackend
!I also want to point out, that you will need to create the "components" directory if you haven't done so. This is where many people add their custom Classes. Whether it be your own helper class, or extending a base Yii component (such as extending
yii\web\Controller
).Create a new file in your
components
directory namedUser.php
. In that file, place the following code:Note:
username
andname
must be valid column names in your database's user table!So now we can use this in our controller, view, anywhere.. Let's test it out. In
views/site/index.php
, add this to the bottom of the page:If all is good, and you have values in the user table for name and username, they should be printed on to the page :)