在Doctrine中,我应该在哪里放置自己的方法?

时间:2009-08-03 18:21:15

标签: php orm doctrine

假设我有一个用户模型。我会将方法放在模型本身上,还是作为模板放置,以便我可以从用户表对象中访问它?

换句话说,更优选的是:

$u=new User();
$u->register($username, $password, $email);

$userTable = Doctrine::getTable('User');
$userTable->register($username, $password, $email);

我的直觉是第二个,因为它在逻辑上更有意义,但是密码更改,登录等等呢?我是否应该将这些内容放在User模型上,同时保留用户表对象上的注册内容?

2 个答案:

答案 0 :(得分:2)

通常,如果事物与用户的特定实例相关,即:我或您,则它们属于User类。如果它们与一组用户有关,或者我们还没有用户(即:从数据库加载它们),那么它们属于Table类。

我会把你的例子作为:

class UserTable {
  function register($username, $password, $email) {
    $user = new User;
    $user->username = $username;
    $user->password = $password;
    $user->email = $email;
    $user->save():
  }
}

人们会争论某些东西属于哪里,而储蓄就是其中之一!我知道Propel,它是另一个类似的PHP ORM,在它的Table等价物中包含一个save方法,以及它的Object等价物,你的注册与此类似。所以肯定有人会尽快争辩另一方!

在我看来,要回答其他问题:

密码更改属于用户,当然 - 您正在更改用户的密码,只是更改字段。

登录应该在表类中 - 它是一个特殊的检索案例。

答案 1 :(得分:2)

这可能不是你问题的完整答案,但如果几天前Matthew Weier o'phinney发表的Play-Doh: Modelling Your Objects会议,你可能会对幻灯片感兴趣;包含可以让你思考模型的好东西; - )

(他们让我思考..但我仍然无法对你的问题给出明确的答案:我会说“这取决于”......但不确定是什么^^)

可能在大型应用程序的情况下,我会再使用一层:

  • 模型,访问数据
  • “服务”,操纵它;能够做的比我在模型中所做的更多...并且在控制器中没有它,它不属于它
  • 当然还有Controller和Views

但是你永远不会让每个人都同意......所以我会说选择一种方式,并确保你团队中的每个人都为整个项目做到这一点:没有什么比在一个方面混合太多不同的方式更糟糕了项目/申请!