加载模型记录,编辑并从控制器保存
问题描述:
我试图通过用户激活页面CakePHP 2
更改注册用户的状态。激活页面包含一个散列字符串,它位于该用户表:加载模型记录,编辑并从控制器保存
id username email password active key
1 bill [email protected] 4u2iu4hk24(hashed str) 0 2ol3p(hashed str)
激活过程适用于像这样的网址:
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()
? 我哪里错了?
答
你没有将ID传递给模型,我想你有验证规则,所以它不会保存记录。在save()之后调试($ this-> User-> invalidFields())。
所有这些都应该在模型中完成,例如User :: verify($ code),如果找不到用户/标记则会抛出异常。记住:微小的控制器,胖的模型。模型也更容易测试。
谢谢,我会尽快检查! – vitto
如果你向我展示一个实用的例子或者其他的东西,那么这将是非常宝贵的,因为我不熟悉MVC,所以我不确定如何在控制器中实现'User :: verity($ code)'。 – vitto
'debug($ this-> User-> invalidFields())'返回一个空数组,我只是从'$ this-> User-> save()'方法中获得'false'。 – vitto