Логика должна не находиться на Пользователе по двум причинам:
- она связывает логику для аутентификации с определенным бэкэндом для пользователя
- Метод работает с внешними аргументами вместо членов объекта.
Теперь вы можете отделить логику аутентификации (1) и работать с членами объекта (2), выполнив
class User …
public function authenticate(Authenticable $adapter)
{
$this->isAuthenticated = $adapter->authenticate(
array(
'username' => $this->username,
'password' => $this->password,
)
);
}
}
но возникает вопрос, почему (и как) пароль вообще должен храниться на Пользователе.Вы, конечно, не хотите иметь открытый текст там.И хеширование пароля, по моему мнению, не является обязанностью Пользователя.На самом деле, вы не можете хэшировать его в User, если вы не добавляете соль пользователю, и я бы не подумал о типичном свойстве User.Вы можете хэшировать пароль, чтобы перефразировать его солью в $ адаптере, но это только излечивает симптомы.В ООП методы объекта должны работать с членами объекта.Но если пароль, в первую очередь, не должен быть членом Пользователя, метод, использующий его, также не должен использоваться для Пользователя ( cohesion ).
Само собой разумеется, если вы используетеActiveRecord, у вас, скорее всего, будет что-то подобное выше, или у вас будет метод аутентификации в качестве статического метода для пользователя, который затем вернет экземпляр.Лично мне не нравятся AR и статические методы, поэтому я бы пошел с отдельным классом службы аутентификации, который возвращает пользователей для меня.