В «Доктрине», где я должен поставить свои собственные методы? - PullRequest
1 голос
/ 03 августа 2009

Допустим, у меня есть модель пользователя. Могу ли я поместить методы в саму модель или в шаблон, чтобы получить к ней доступ из объекта пользовательской таблицы?

Другими словами, что предпочтительнее:

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

или

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

Мой инстинкт был бы вторым, поскольку он логически более логичен, но как насчет таких вещей, как смена пароля, вход в систему и т. Д.? Должен ли я действительно поместить их в модель User, в то время как я сохраняю такие вещи, как регистрация в объекте таблицы user?

Ответы [ 2 ]

2 голосов
/ 03 августа 2009

Вероятно, это не будет полным ответом на ваш вопрос, но вам может быть интересно взглянуть на слайды, если Play-Doh: Моделирование ваших объектов конференция, на которой Мэтью Вейер О'Финни опубликовано несколько дней назад; там есть хорошие вещи, которые могут заставить вас думать о моделях; -)

(Они заставили меня задуматься .. Но я до сих пор не могу дать однозначный ответ на ваш вопрос: я бы сказал «это зависит» ... Но не уверен, от чего ^^)

Вероятно, в случае большого приложения я бы использовал еще один слой:

  • Модель, для доступа к данным
  • «Служба», чтобы манипулировать ею; быть способным сделать больше, чем то, что я бы положил в модель ... И не иметь этого в контроллере, где он не принадлежит
  • И, конечно же, Controller и Views

Но вы никогда не заставите всех согласиться ... Поэтому я бы сказал, выберите один путь и убедитесь, что все в вашей команде делают это для всего проекта: нет ничего хуже, чем слишком много разных способов, смешанных в одном проект / заявка!

2 голосов
/ 03 августа 2009

Как правило, если вещи относятся к конкретному экземпляру пользователя, то есть ко мне или вам, они принадлежат к классу пользователя. Если они относятся к группе пользователей или у нас еще нет пользователя (т. Е. Они загружаются из базы данных), то они принадлежат к классу 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, включает метод save в свой эквивалент таблицы, а также в эквивалент объекта, и ваша регистрация выглядит аналогично этому. Так что уверен, что кто-то скоро будет спорить с другой стороной!

Чтобы ответить на другие вопросы, на мой взгляд:

Смена пароля принадлежит Пользователю, определенно - вы изменяете пароль пользователя, просто меняете поле.

Вход в систему должен выполняться в классе таблицы - это специальный случай получения.

...