2

我正在使用 Twitter/Facebook 集成制作一个简单的 PHP 应用程序来练习 OOP 概念和模式,我需要有关如何设计它的帮助。

我的应用程序会做什么

基本上,一旦用户登录,他就会显示一个带有标题和正文字段的表单。当他点击“发布”时,该内容将被适当地转换并发布到 Facebook 和 Twitter。当然,如果他还没有这样做,他还可以选择验证我的 FB/Twitter 应用程序。这就是我想要达到的目标。

到目前为止我想出的结构

由于必须在多个文件之间共享数据库访问,因此我使用的是单例模式。本质上,我有一个带有静态mysqli 链接的 DB 类和一个获取此数据库链接的静态方法。模型将通过这个单一链接使用 mysqli 函数。(我还不想抽象数据库类型。)

我有一个User类,它保存用户的数据,比如它的id、username 和 hashed password。它具有根据 id、凭据检索用户甚至将当前用户保存到数据库的方法。

Auth类管理会话并为有效用户返回一个User对象。因此,它管理登录,并在页面访问之间保持用户登录。

我遇到问题的结构

我现在需要访问用户的Twitter 和 Facebook信息。当然,它们将位于不同的表中,并有单独的类与它们交互。但是这个类中的每一个都与一个User相关联。

因此,当我从数据库中获取用户信息时,我还将使用 JOIN 从 Twitter 和 Facebook 表中获取相应的数据。然后,我的计划是在我的 User 对象中实例化一个 Twitter 和 Facebook 对象。所以,这两个类可以通过 $user->twitter->post("Something"); 来访问。

这是一个好的结构,还是有更好的组织课程的方法?这是一个简单的应用程序,编码不是我关心的。我关心的是结构,因为我应该能够向应用程序添加新的社交网络。

4

1 回答 1

2

最好将持久性功能保留在域对象之外。我将有一个接口,而不是让User类加载和保存自己,UserRepository例如:

interface UserRepository {
  public function findUser($username);
  public function save(User $user);
}

和一个MysqlUserRepository实现这个接口的类。这样,您就可以将特定于数据库的代码排除在User类之外。

同样,我会将社交网络功能拉入它们自己的界面,例如:

interface SocialNetworkService {
  public function post($status);
}

FacebookService和的单独实现TwitterService。这允许您添加对新社交网络的支持,而无需修改User类。

然后,这些服务可以简单地包装用户对象并为该用户提供服务:

$fb = new FacebookService($user);
$fb->post("blah");

所有这些决定背后的一个共同原则是单一责任原则:你的User类应该只有一个改变的理由,那就是当你需要改变用户的模型时。任何其他更改,例如处理数据库或社交网络,都不应影响User课程。

于 2012-07-09T03:37:35.440 回答