拆分OOP组件并在它们之间传递数据


Splitting up OOP components and passing data between them

管理员决定禁止某些用户并获取他们的ID。以灵活和面向对象的方式编写它的最佳方式是什么

这些建议是在没有考虑使用数据映射器的情况下提出的,因为我认为自己还没有使用这样的方法,但如果认为有必要,我会非常感谢一些关于如何在这种情况下使用的好例子,因为我发现缺少在线例子。

以下是我目前的想法:

  1. 由数据库表(如"Users")生成的User对象。此对象应:

    a)是否有从存储的数据中提取行和设置变量的方法?

    b)是否将禁止状态存储在与用户名、密码和电子邮件等相同的数据库行中。?

    c)是否将禁止状态自身映射到变量(如public $banned;)?

  2. 一个UserControl对象,用于处理诸如禁止之类的功能。

    a)应该向该对象传递User对象并获取其ID,还是仅将ID作为参数?

    b)应该为每个需要禁止的用户创建一个新的UserControl对象还是静态对象?

    c)这个对象应该简单地切换$banned,然后让User对象保存自己,还是自己执行逻辑;在给定ID所在的行上设置Users表中的"禁止"列?

我想,如果我把所有这些方法都放在User对象中,它很快就会变成一个有$user->hasImages();$user->isBanned();$user->sendNewsFeed();的God对象,所以我可能需要一些关于如何以足够灵活的方式来实现这一点的建议,以便在处理大量用户和使用集合等的环境中轻松添加和删除功能。

Id建议ACL实现。这比你目前所问的要多,但我很难相信你不需要管理不同级别(管理员、访客、用户等)对不同事物(论坛、图片、页面等)的访问。通过使用ACL,你可以对所有内容使用相同的代码,而"禁令"只是一个拒绝访问所有内容的ACL。

您可以查看Zend_Acl组件以供参考,但是否需要这样健壮的组件是您的决定。

如果用户对象中有一个UserStatus字段,并表示该对象中的Banned、Guest、User、Mod、Admin,那么只需查看它们的状态是否为Banned。