我正在尝试在CakePHP2中编写我的第一个项目(之前我使用过CakePHP1),我遇到了以下问题。
我有几个模型需要字段的自定义验证规则(个人数字代码)。验证规则非常大,所以我不想在每个模型中重复代码。
相反,我考虑用一个函数编写一个组件,该函数将接收一个字符串作为参数并对其进行验证,并从每个模型中调用该特定函数。
我读过应该在控制器中使用组件,所以这可能不是最好的方法吗?
我想要做的是实际扩展ModelValidator并添加我自己的自定义规则,但我不知道是否可行。
谢谢你的帮助。
答案 0 :(得分:0)
不,组件不适用于型号。我为自定义验证规则所做的是向AppModel添加方法。然后,您可以在模型的任何验证数组中使用它们。
如果您还不知道如何使用自定义验证方法,请参阅Cake book部分:
http://book.cakephp.org/2.0/en/models/data-validation.html#adding-your-own-validation-methods
但是不是将方法放在你需要的每个模型中,而是将它放在你的AppModel中(如果你没有AppModel类,请创建一个如下所示并保存到app/Model/AppModel.php
。您的模型将继承此类,因此您的自定义验证方法可用于任何模型。)
这是一个简单的例子:
/**
* app/Model/AppModel.php
*/
class AppModel extends Model {
/**
* Validation rule for integers
*
* @param mixed $value
* @return bool
*/
public function validateInteger($value) {
return preg_match('/^\d+$/', array_shift($value));
}
}
/**
* app/Model/MyModel.php
*/
class MyModel extends AppModel {
/**
* Validation
*
* @var array
*/
public $validate = array(
'my_field' => array(
'rule' => 'validateInteger',
'message' => 'This field only accepts integers'
)
);
}
我还想过拥有自定义验证行为的想法,其中包含所有这些验证方法,但由于行为的限制,我发现它不能很好地工作并且不方便。
答案 1 :(得分:0)
我找到了自己问题的答案:行为。
CakePHP结构推荐:
组件应在控制器中使用
应在视图中使用助手
应在模型
要定义我执行以下操作的行为:
在app / Model / Behavior / ValidateBehavior.php文件中:
class ValidateBehavior extends ModelBehavior {
// the first param is the model object
public function isValidCnp($Model, $data) {
// data is an array that contains the field name and value
// define validations rules here
// return true or false
}
}
在我的模型app / Model / User.php中,我需要验证数据:
class User extends AppModel {
// link the behavior to the model
public $actsAs = array('Validate');
// define a custom validation rule that calls a function from the behavior
public $validate = array(
'cnp' => array(
'custom' => array(
'rule' => array('isValidCnp')
)
),
);
}
关于行为的好处是它们看起来像父类一样,它们也可以包含beforeSave,beforeDelete等的回调函数。
模型可以像使用自己的方法一样从行为中调用函数,这意味着行为也可以在控制器中使用:
$this->User->isValidCnp()