В Doctrine, где я должен использовать свои собственные методы?
Вопрос
Допустим, у меня есть пользовательская модель.Могу ли я поместить методы в саму модель или в качестве шаблона, чтобы я мог получить к ней доступ из объекта user table?
Другими словами, что более предпочтительно:
$u=new User();
$u->register($username, $password, $email);
или
$userTable = Doctrine::getTable('User');
$userTable->register($username, $password, $email);
Мой инстинкт был бы вторым, поскольку это логически имеет больше смысла, но как насчет таких вещей, как смена пароля, вход в систему и т.д.?Должен ли я действительно поместить их в пользовательскую модель, пока я сохраняю такие вещи, как register в объекте user table?
Решение
Вероятно, это не будет полным ответом на ваш вопрос, но вам может быть интересно взглянуть на слайды, если Пластилин:Моделирование Ваших объектов конференция, которую Мэтью Вейер о'Финни опубликовал несколько дней назад ;там есть приятные вещи, которые могли бы заставить вас задуматься о Моделях ;-)
(Они заставили меня задуматься..Но я все еще не могу дать окончательного ответа на ваш вопрос :Я бы сказал "это зависит"...Но не уверен, в чем ^^ )
Вероятно, в ситуации с большим приложением я бы использовал еще один слой :
- Модель, для доступа к данным
- "Сервис", чтобы манипулировать им ;быть способным делать больше, чем то, что я бы заложил в Модель...И нет этого в Контроллере, где ему не место
- И, конечно же, Контроллер и представления
Но вы никогда не заставите всех согласиться...Поэтому я бы посоветовал выбрать один способ и убедиться, что все в вашей команде поступают так же для всего проекта :нет ничего хуже, чем слишком много разных способов, смешанных в одном проекте / приложении !
Другие советы
Как правило, если что-то относится к конкретному экземпляру пользователя, т.е.:я или вы, они принадлежат к классу 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, включает метод save в его табличном эквиваленте, а также в его объектном эквиваленте, и ваша регистрация в некотором роде аналогична этому.Так что уверен, что скоро кто-нибудь появится, чтобы переспорить другую сторону!
Чтобы ответить на другие вопросы, на мой взгляд:
Смена пароля, безусловно, принадлежит Пользователю - вы меняете пароль пользователя, это просто изменение поля.
Вход в систему должен осуществляться в классе table - это специализированный случай извлечения.