MVC ORM和用户相关数据

时间:2013-01-26 04:35:28

标签: php session orm yii yii-cmodel

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

如果某个地方我需要用户的背景图片设置,请执行以下操作

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

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

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

2 个答案:

答案 0 :(得分: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, ...);

关于建议的其他答案:

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

答案 1 :(得分:1)

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

public static function getUser() {
    static $user;

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

    return $user;
}

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

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