1

Yiiは、通常の開発で問題ないORMベースの開発を提供します。私の質問は、私のアプリケーションには、ユーザー情報、ユーザー設定、ユーザー設定などの多くのユーザー関連データがあるということです。ここで、userとは、現在ログインしているユーザーを意味します。

ユーザーの背景画像の設定が必要な場合は、次のようにします

$user = User::model()->findByPk(Yii::app()->user->id);

$bgImage = $user->settings->backgroundImage;

背景画像が必要な場所では、アプリケーションの別の場所で同じことを繰り返します。$ userのインスタンスを再度作成することを意味しますが、これは適切なアプローチではないと思います。それで、ユーザークラスを何度もインスタンス化する必要がない方法はありますか?セッションアプローチが好きではないことを忘れないでください。

4

2 に答える 2

1

関連するリソース(クラス、配列など)を共有する最も一般的な方法は、依存性注入アプローチです。これにより、クラス構造が安定し、依存関係が可能な限り明確になります。この場合、ユーザーモデルを一度インスタンス化し、コンストラクターを介してそれを必要とするすべてのクラスに渡すことをお勧めします。

ユーザーモデルクラスを次のようUserModelに見なし、それに依存するクラスのコンストラクターを次のように見なします。

public function __construct(UserModel $user, ...) { ... }

その後、次のように使用できます。

$user = User::model()->findByPk(Yii::app()->user->id);
$bgImage = $user->settings->backgroundImage;

$dependentclass1 = new DependentClass1($user, ...);
...
$dependentclass2 = new DependentClass2($user, ...);
...
$dependentclass3 = new DependentClass3($user, ...);

提案された他の答えについて:

知っておくべきシングルトン(アンチ)パターンの使用に関して、かなりの数の戦争があったことを知っておくのは正しいことです。それらのほとんどは、ここでもSOで説明されています。ただし、覚えておく必要があります。デザインパターン(DIやシングルトンなど)は単なるオプションであり、要件ではないため、状況に応じて、より意味のあるものを自由に使用できます。

于 2013-01-26T04:55:18.223 に答える
1

別のアプローチは、シングルトンを使用することです。ライブラリコードでは、次のようにします。

public static function getUser() {
    static $user;

    if (!$user) {
        $user = User::model()->findByPk(Yii::app()->user->id);
    }

    return $user;
}

これは何度でも呼び出すことができますが、1回のWebリクエストで、データベースの呼び出しは1回だけ行われます。

Webリクエスト内で変更される可能性がある場合は、代わりにその値でインデックス付けされた静的配列を使用する価値があることに注意してください。そのYii::app()->user->idため、ユーザーがログオンまたはログオフした場合、メソッドは正しくキャッシュされます。

于 2013-01-26T08:46:12.493 に答える