#model-view-controller #controller #save #cakephp-2.0
#модель-представление-контроллер #контроллер #Сохранить #cakephp-2.0
Вопрос:
Я пытаюсь изменить статус зарегистрированного пользователя с помощью страницы активации пользователя CakePHP 2
. Страница активации содержит хэшированную строку, которая находится в этой таблице пользователей:
id username email password active key
1 bill me@domain.com 4u2iu4hk24(hashed str) 0 2ol3p(hashed str)
Процедура активации работает с URL-адресом, подобным этому:
http://url.com/users/activate/2ol3pth3i89txc2zd6tg3
Все, что я делаю, это получаю хэшированный ключ, выполняю поиск зарегистрированного пользователя с этим key
, загружаю его, удаляю хэшированный ключ и меняю active
статус на 1
.
Я выполняю эту процедуру в этом Controller
методе:
public function activate ($code = false) {
if (!empty ($code)) {
$this->User->findByActivationKey($code); // magic find instead of $this->User->find('contidions', array('User.activation_key' => $code));
if (!empty($user)) {
$this->User->set(array (
'activation_key' => '0',
'active' => 1
));
if ($this->User->save()) {
$this->render('activation_successful');
} else {
// here is always where I get with this code
$this->render('activation_fail');
}
} else {
$this->render('activation_fail');
}
}
}
Все идет нормально, но $this->User->save()
не будет работать.
Использование debug($this->User->invalidFields());
вернет эту ошибку:
app/Controller/UsersController.php (line 64)
Array
(
[password] => Array
(
[0] => Password must contain <span5</span> chars min and <span>20</span> chars max message.
[1] => Password must contain <span5</span> chars min and <span>20</span> chars max message.
)
)
Очевидно, что ошибка связана с моделью, но почему password
упоминается?
<?php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
public $name = 'User';
var $validate = array (
'username' => array (
'MustBeCompiled' => array (
'rule' => 'notEmpty',
'message' => 'Error message'
)
),
'password' => array (
'not_empty' => array (
'rule' => 'notEmpty',
'message' => 'Password cannot be empty message.'
),
'between' => array (
'rule' => array ('between', 5, 20),
'message' => 'Password must contain <span5</span> chars min and <span>20</span> chars max message.'
)
),
'email' => array (
'valid_email' => array (
'rule' => 'email',
'message' => 'Mail invalid message.'
),
'existing_email' => array (
'rule' => 'isUnique',
'message' => 'Mail in use message.'
)
)
);
function beforeSave ($options = array()) {
// the way to hash the password
if (!empty ($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
return true;
}
}
}
?>
Может быть, проблема может быть в beforeSave()
?
Где я ошибаюсь?
Ответ №1:
Вы не передаете идентификатор модели, и я предполагаю, что у вас есть правила проверки, поэтому запись не будет сохранена. отладка ($this->User->invalidFields()) после сохранения().
И все это должно быть сделано в модели, что-то вроде User::verify($code) и выдавать исключение, если пользователь / токен не найден. Помните: крошечные контроллеры, толстые модели. Модели также легче тестировать.
Комментарии:
1. Было бы здорово, если бы вы показали мне практический пример, или что-то еще, потому что я не эксперт в MVC, поэтому я не уверен, как реализовать
User::verity($code)
в контроллере.2.
debug($this->User->invalidFields())
возвращает пустой массив, который я просто получаюfalse
из$this->User->save()
метода.