【问题标题】:MVC ORM and user related dataMVC ORM 和用户相关数据
【发布时间】:2013-01-26 04:35:27
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 创建一个 $appUser 类型的全局变量并实例化一个用户对象并分配给它,然后在任何 php 文件中使用该全局变量。在您想要获取所有内容的任何地方使用它,包括设置和您拥有的任何内容。您甚至可以更新查询以引入多个表以避免数据库故障。

标签: php session orm yii yii-cmodel


【解决方案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 请求中发生变化,则值得使用由该值索引的静态数组 - 因此,如果您的用户登录或注销,该方法会正确缓存。

【讨论】:

    【解决方案2】:

    共享相关资源(类、数组...)最常见的方法是依赖注入方法,它真正使类结构稳定,使依赖关系尽可能清晰。在这种情况下,我建议您将用户模型实例化一次,然后通过其构造函数将其传递给每个需要它的类。

    假设您的用户模型类是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, ...);
    

    关于建议的其他答案:

    您应该知道,围绕使用单例(反)模式已经发生了很多战争,这是正确的。 Most of them has been discussed here on SO aswell。 但是您必须记住:设计模式(如 DI 和 Singleton)只是一个选项,而不是要求,因此您可以随意使用对您更有意义的任何东西, 在你的上下文中。

    【讨论】:

    • 谢谢。这种方法听起来不错。能给个链接或者代码吗?
    猜你喜欢
    • 2012-02-03
    • 2011-07-17
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多