Рассмотрим следующий классОбработка Dependency объекта
class User
{
protected $password;
public function setPassword($password)
{
$this->password = $password;
return $this;
}
public function getPassword()
{
return $this->password;
}
}
Я хочу подать Bcrypt на пароль, используя Zend\Crypt\Password\Bcrypt
в пользовательском объекте, так как это создает зависимость я хочу знать, как правильно справиться с этим, я могу думать о несколько подходов к этой работе, позвольте мне уточнить
Подход 1: Здесь мы создаем экземпляр класса внутри метода и применяем необходимые изменения.
class User
{
protected $password;
public function setPassword($password)
{
$bcrypt = new Bcrypt();
$this->password = $bcrypt->create($password);
return $this;
}
public function getPassword()
{
return $this->password;
}
public function verifyPassword($password)
{
$bcrypt = new Bcrypt();
return $bcrypt->verify($password, $this->getPassword());
}
}
К моему пониманию этого не рекомендуется подход, так как я вижу две проблемы здесь
- Bcrypt() экземпляра дважды
- Это делает объект пользователя тесно связанные с Bcrypt
Я могу решить проблему-1 путем создания экземпляра Bcrypt() один раз в конструкторе класса и использовать его, когда это требуется, однако это не решает проблему-2
подход 2: Переместить объект Bcrypt из класса пользователя и ввести его во время установки пароля
class User
{
protected $password;
public function setPassword($password)
{
$this->password = $password;
return $this;
}
public function getPassword()
{
return $this->password;
}
}
// Init Bcrypt
$bcrypt = new Bcrypt;
// Instantiate user object and create a password
$user = new User;
$user->setPassword($bcrypt->create($password));
// Verify user password
if ($bcrypt->verify($password, $user->getPassword())) {
// Password is verified
}
Каков наилучший способ по этому поводу?
Спасибо.
Вы правы, я думаю, что лучший подход должен иметь класс PasswordService –
Если вы планируете добавить другие методы, которые будут обрабатывать пароль, этот подход имеет смысл. В противном случае, какая разница между использованием класса Bcrypt и класса PasswordService (в случае вашего второго вопроса)? –
Вы не будете отделяться от рамки в любом случае, если вы не используете какой-то интерфейс 'HashingMechanism', который (на данный момент) реализован классом BcryptProxy. – shudder