1

Yii 提供基于 ORM 的开发,可以正常开发。我的问题是,在我的应用程序中有很多与用户相关的数据,例如用户信息、用户设置、用户偏好等。这里的用户是指当前登录的用户。

如果某处我需要用户的背景图片设置,我会执行以下操作

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

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

我在需要背景图像的应用程序的其他地方重复同样的事情。意味着再次创建 $user 的实例,我认为这不是一个好方法。那么,有没有一种方法我们不需要一次又一次地实例化用户类???请记住,我不喜欢会话方法。

4

2 回答 2

1

另一种方法是使用单例。在库代码中,执行以下操作:

public static function getUser() {
    static $user;

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

    return $user;
}

这可以调用任意多次,但在单个 Web 请求中,数据库调用只会进行一次。

请注意,如果Yii::app()->user->id可能在 Web 请求中发生变化,则值得使用一个由该值索引的静态数组 - 因此,如果您的用户登录或注销,该方法会正确缓存。

于 2013-01-26T08:46:12.493 回答
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 和 Singleton)只是一种选择,而不是要求,因此您可以在您的上下文中自由使用对您更有意义的任何东西。

于 2013-01-26T04:55:18.223 回答