最好的做法是,如何在Symfony2中创建一个延迟加载的用户实体?

时间:2013-03-23 00:43:47

标签: php symfony

我正在从基于Web的API中获取用户数据,并且我想避免获取数据,因此如果我从不需要该数据,则会发出HTTP请求。我在考虑创建一个User类,在其构造函数中使用$userID,并简单地存储它。 如果在某个时间点调用了getUserName()之类的任何getter方法,它将进行调用并从API中获取数据。

现在,我创建了一个应该完成所有API工作的服务。我如何将此APIWrapper服务连接到我的User实体类?我读到依赖于实体类中的服务容器被认为是不好的风格。如果这是一个通常首选的解决方案,我只需要User类依赖于服务容器并调用APIWrapper服务,通过引用传递User对象并让服务填写从API获取的所有内容。但是,如果User类不依赖于服务容器,我怎么能这样做?

我希望能够像这样使用它:

$user1 = new User(1234);
$user2 = new User(2345);
echo $user2->getName();

它只会从API中获取user2的名称,而对user1不执行任何操作。这样,我也可以轻松实现缓存,所以我根本不需要查询API。

因此。什么被认为是最好的方法呢?

1 个答案:

答案 0 :(得分:0)

如果用户正在对进行身份验证并且最初使用第三方服务注册,那么您应该只在注册时获得该信息。您希望有多少用户永远不需要提供他们的基本帐户信息?

将服务注入实体确实是不好的做法,因为实体的目的只不过是包含对象及其数据。您应该使用UserProvider来获取现有用户的用户数据,如集成FOSUserBundle和FOSFacebookBundle的各种指南中所述。

现在,当您进行Google搜索以整合这两个捆绑包时,或者当您四处询问时,您将被指向付费的截屏视频,费用为15美元。如果您真的致力于将Symfony作为您项目的框架,那么看看构建Symfony事物的人是如何思考的可能是值得的。如果你愿意处理一些自己的头发,你可以深入挖掘搜索结果,并查看像这样的资源:https://gist.github.com/iBet7o/5215066

您的确切实现将取决于您使用的捆绑包,但一般来说,您的代码最终应该是这样的:

function getName() {
    if($this->name == '') {
        return $this->getSignupProvider()->getUserinfo(); // or maybe just getProvider()
    }
    return $this->name;
}