我正在制作一个与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
类。