我正在制作一个与 Twitter/Facebook 集成的简单 PHP 应用程序,以练习 OOP 概念和模式,并且我需要有关如何设计它的帮助。
我的应用程序会做什么
基本上,一旦用户登录,他就会显示一个带有标题和正文字段的表单。当他点击“发布”时,该内容将被适当转换并发布到 Facebook 和 Twitter。当然,如果他还没有这样做的话,他还可以选择验证我的 FB/Twitter 应用程序。这就是我想要实现的目标。
到目前为止我想出的结构
由于数据库访问必须在多个文件之间共享,因此我使用单例模式。本质上,我有一个带有静态 mysqli 链接 的数据库类和一个获取此数据库链接的静态方法。这些模型将使用带有此单个链接的 mysqli 函数。 (我还不想抽象数据库类型。)
我有一个User类,它保存用户的数据,例如id、用户名和哈希密码。它有方法根据 ID、凭据检索用户,甚至将当前用户保存到数据库。
Auth 类管理 session 并返回有效用户的 User 对象。因此,它管理登录,并在页面访问之间保持用户登录。
我遇到问题的结构
我现在需要访问用户的 Twitter 和 Facebook 信息。当然,它们将位于单独的表中,并且有单独的类与它们交互。但此类中的每个类都与一个用户相关联。
因此,当我从数据库中获取用户信息时,我还将使用 JOIN 从 Twitter 和 Facebook 表中获取相应的数据。然后,我的计划是在我的 User 对象中实例化 Twitter 和 Facebook 对象。因此,这两个类可以通过 $user->twitter->post("Something"); 来访问。
这是一个好的结构,还是有更好的方式来组织类(class)?这是一个简单的应用程序,编码不是我关心的。我关心的是结构,因为我应该能够向应用程序添加新的社交网络。
最佳答案
最好将持久性函数保留在域对象之外。我不会让 User
类自行加载和保存,而是使用 UserRepository
接口(interface),例如:
interface UserRepository {
public function findUser($username);
public function save(User $user);
}
和一个实现此接口(interface)的MysqlUserRepository
类。这样您就可以将特定于数据库的代码保留在 User
类之外。
同样,我会将社交网络功能引入到它们自己的界面中,例如:
interface SocialNetworkService {
public function post($status);
}
以及 FacebookService
和 TwitterService
的单独实现。这使您可以添加对新社交网络的支持,而无需修改 User
类。
这些服务可以简单地包装用户对象并为该用户提供服务:
$fb = new FacebookService($user);
$fb->post("blah");
所有这些决策背后的一个共同原则是单一责任原则:您的 User
类应该只有一个更改原因,那就是当您需要更改用户模型时。任何其他更改(例如处理数据库或社交网络)不应影响 User
类。
关于php - PHP/Twitter/Facebook 应用程序的 OOP 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382831/