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

标签 php oop

我正在制作一个与 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);
}

以及 FacebookServiceTwitterService 的单独实现。这使您可以添加对新社交网络的支持,而无需修改 User 类。

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

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

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

关于php - PHP/Twitter/Facebook 应用程序的 OOP 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11382831/

相关文章:

php - Laravel 不接受我的数据库输入

php - Telegram REST API,在消息文本中发送换行符?

c++ - 在父类中使用 protected 数据,传递给子类

php - 如何使用 php oop 显示 mysql 中的多行?

php - PHP 类中的 Mysqli

php - 如何在 PHP 中将方法声明为公共(public)但非静态的?

c# - 在什么情况下我应该使用单例类?

php - JavaScript:如何创建 JSONP?

php - 双引号嵌套数组不起作用

php - 如何让自定义播放器播放 Dailymotion 视频?