我正在从基于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。
因此。什么被认为是最好的方法呢?
答案 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;
}