3

を使用して変数をどのように追加または取得しますYii::$app->user->somethingか?

私はそれらを通過させたくありませんidentity。を通じて特定のものにアクセスできるようにしたいuser

たとえば、現在ログインしているユーザーのユーザー名と名前を取得したい:

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

また

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

1 に答える 1

14

SO に関する他のトピックでは、簡単なハック ソリューションを提供したり、単純に を介してフェッチしたりしYii::$app->user->identityていますが、適切に行う方法を紹介します。事実上すべてを拡張することで、Yii2 を思い通りに曲げることができます!

私は通常「高度な」アプリで作業しますが、「基本的な」アプリはすべての人の参考として使用するだけです。「高度な」アプリを使用している人は、違いを知っていて、名前空間を理解していると思います。

名前空間クラッシュ コース:基本的に、namespace app\path\to. これがファイルの場所です。たとえば、アプリのルートmodelsディレクトリに ContactForm.php があるので、その名前空間はapp\models. 高度な場合、複数のアプリ (フロントエンドとバックエンド) があるため、アプリのルートが異なり、frontend1 つのアプリ ルートとbackend別のアプリ ルートがあります。高度なアプリのモデル ディレクトリは "frontend/models" にあり、その名前空間はfrontend\models. -- したがって、名前空間で「app」が表示されている場所ならどこでも、「advanced」テンプレートに置き換えることができfrontendますbackend


解決

まず、アプリの構成ファイルを変更して、デフォルトの User コンポーネントのクラスをオーバーライドする必要があります。identityClass関係のないものは除外しますので、定義したままにしておいてください。表示していません。config を置き換えるのではなく、単に追加しているだけです。また、私が示したところではfrontend/something、同じことを に対して行うことができますbackend/something。私は両方を何度も繰り返すつもりはありません...

基本 ( config/web.php) - または - 高度 ( frontend/config/main.php)

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

注意: 高度なテンプレートを使用している場合は、または!に置き換えappてください。frontendbackend

また、「components」ディレクトリを作成していない場合は作成する必要があることも指摘しておきます。これは、多くの人がカスタム クラスを追加する場所です。それが独自のヘルパー クラスであろうと、ベース 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;
    }
}

注: usernameandnameは、データベースのユーザー テーブルで有効な列名でなければなりません!

これで、コントローラー、ビュー、どこでもこれを使用できるようになりました。テストしてみましょう。で、これviews/site/index.phpをページの下部に追加します。

<?= \Yii::$app->user->name ?>
<?= \Yii::$app->user->username ?>

すべて問題がなく、ユーザー テーブルに名前とユーザー名の値がある場合、それらはページに出力されるはずです:)

于 2016-07-16T20:34:29.370 に答える