Загрузка записи модели, ее редактирование и сохранение из контроллера

#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() метода.