我已经设置了一个模型和行为,其中行为包含一些自定义验证规则方法,比如匹配以确保两个字段具有相同的值,这是有效的,但是有一些非常通用的$ validate规则我想重用用于密码之类的不同型号。当我将$ validate数组放入我的ValidateBehavior并在我的控制器中调用validate时,它似乎没有点击任何验证,即使字段不正确,一切都会通过。
我可以在我的行为中使用$ validate让我的模型使用它并在我在帖子上调用验证时工作吗?这post似乎表明我可以,但它不起作用。
MODEL:
class Admin extends AppModel
{
public $name = 'Admin';
public $actsAs = [ 'Validate' ];
}
BEHAVIOR:
class ValidateBehavior extends ModelBehavior
{
public $validate = [
'currentpassword' => [
'notEmpty' => [
'rule' => 'notEmpty',
'message' => 'Current password is required.'
],
'minLength' => [
'rule' => [ 'minLength', '8' ],
'message' => 'Passwords must be at least 8 characters long.'
]
],
'newpassword' => [
'notEmpty' => [
'rule' => 'notEmpty',
'message' => 'New password is required.'
],
'minLength' => [
'rule' => [ 'minLength', '8' ],
'message' => 'Passwords must be at least 8 characters long.'
],
'match' => [
'rule' => [ 'match', 'confirmpassword' ],
'message' => 'New password must match the confirmation password'
]
],
... etc
public function match( Model $Model, $check, $compareTo )
{
$check = array_values( $check )[ 0 ];
$compareTo = $this->data[ $this->name ][ $compareTo ];
return $check == $compareTo;
}
}
function changepassword() {
$post = $this->request->data;
// Was there a request to change the user's password?
if ($this->request->is( 'post' ) && !empty( $post )) {
// Set and validate the post request
$this->Admin->set( $this->request->data );
// Set of validation rules to be run
$validateRules = [
'fieldList' => [
'currentpassword',
'newpassword',
'confirmpassword'
]
];
if ($this->Admin->validates( $validateRules )) {
// makes it here even though all fields are empty when
// the validation rules are in the behavior otherwise
// when left in the model and the behavior only has
// the methods like match this all works
...etc
}
...etc
}
答案 0 :(得分:1)
我可以在我的行为中使用$ validate让我的模型使用它并在我在帖子上调用验证时工作吗?
不是你尝试这样做的方式。这是基本的OOP:你不能在没有传递A的实例或继承A的情况下神奇地在类B中调用类A的属性。但这是你在代码中所期望的。这不适用于某个行为,也不适用于任何PHP脚本。
我建议您阅读CakePHP框架的工作原理以及行为的工作原理。书中There are examples也是如此。也许关于OOP。为自己回答这些问题:行为如何知道模型的验证规则?
在Cake2中,每个行为方法都将模型作为第一个参数。在行为的setup()方法中根据需要更改验证规则。
public function setup(Model $Model, $settings = array()) {
$Model->validate; // Do something with it here
}
不是在那里分配规则,而是将它们合并在那里更好。所以现在B类(行为)有一个A(模型)实例可用,可以改变它的公共属性。
我建议您使用read the chapter about behaviors和php手册OOP部分。