Я вижу, что вы проверяете и манипулируете данными в контроллере. Делать это в модели, как правило, лучше. Я реализовал подобную функциональность всего несколько дней назад. Мой change_password()
метод выглядит примерно так:
# app/controllers/users_controller.php
function change_password() {
if (!empty($this->data)) {
if ($this->User->save($this->data)) {
$this->Session->setFlash('Password has been changed.');
// call $this->redirect() here
} else {
$this->Session->setFlash('Password could not be changed.');
}
} else {
$this->data = $this->User->findById($this->Auth->user('id'));
}
}
А вот урезанная версия представления, используемого с этим методом:
# app/views/users/change_password.ctp
echo $this->Form->create('User');
echo $this->Form->input('id');
echo $this->Form->input('current_password');
echo $this->Form->input('password1');
echo $this->Form->input('password2');
echo $this->Form->end('Submit');
Код, который делает что-то интересное, находится в модели. Я добавил поля из формы в свойство validate
и написал пользовательские методы проверки . Это позволяет мне использовать поля password1 и password2 в любом другом месте приложения, например, в форме регистрации.
# app/models/user.php
var $validate = array(
'current_password' => array(
'rule' => 'checkCurrentPassword',
'message' => '...'
),
'password1' => array(
'rule' => 'checkPasswordStrength',
'message' => '...',
),
'password2' => array(
'rule' => 'passwordsMatch',
'message' => '...',
)
);
Наконец, в обратном вызове beforeSave()
для модели я установил password
в хэш password1
, чтобы подготовить данные для сохранения в базе данных.