PHP/Twitter/Facebook应用程序的OOP结构


OOP Structure for a PHP/Twitter/Facebook App

我正在制作一个与Twitter/Facebook集成的简单PHP应用程序,以实践OOP概念和模式,我需要如何设计它的帮助。

我的应用程序将做什么

基本上,一旦用户登录,他就会显示一个带有标题和正文字段的表单。当他点击"发布"时,这些内容将被适当地转换并发布到Facebook和Twitter上。当然,如果他还没有认证我的FB/Twitter应用程序,他也可以选择认证。这就是我正在努力实现的。

到目前为止我一直在构思的结构

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

我有一个User类,它保存用户的数据,比如id、用户名和散列密码。它有一些方法可以根据id、凭据检索用户,甚至将当前用户保存到数据库中。

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

我的结构有问题

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

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

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

最好将持久性函数保留在域对象之外。我将有一个UserRepository接口,而不是加载并保存User类本身,例如:

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

以及实现该接口的CCD_ 3类。这样就可以将特定于数据库的代码排除在User类之外。

同样,我会把社交网络功能拉到他们自己的界面上,比如:

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

以及CCD_ 5和CCD_。这允许您添加对新社交网络的支持,而无需修改User类。

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

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

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