CakePHP 仅当几个必填字段不为空时才验证特定规则
CakePHP Validate a specific rule only when a couple required fields aren't empty
我编写了一个自定义规则方法,用于在添加新记录之前验证数据库中是否存在记录。我把这个方法放在一个行为中,这样我就可以与其他模型共享它,但是我 运行 陷入了先有鸡还是先有蛋的局面。
为了知道一个类别是否已经有一个特定的组名,我需要有类别 ID 和组名。所以我通过使用我的自定义规则(category_id 和名称)传递这些键。但是,这是行不通的,因为如果我没有错误地选择 category_id,那么查询只会出现在名称上,所以我用几行修补了它,但需要 return true如果是这种情况,银行认为 category_id 验证无效。
有没有更好的方法来实现这种验证?这不是我想的那么糟糕吗?或者只是不要打扰,如果它通过,在我的控制器中将 hasAny() 放在我对 validates() 的调用下。
MODEL:
public $validate = [
'category_id' => [
'rule' => 'notEmpty',
'message' => 'Category is required.'
],
'name' => [
'notEmpty' => [
'rule' => 'notEmpty',
'message' => 'Team is required.'
],
'recordExists' => [
'rule' => [ 'recordExists', [ 'category_id', 'name' ] ],
'message' => 'Group already exists.'
]
]
];
// BEHAVIOR:
public function recordExists( Model $Model, $conditions, $requireKeys )
{
// Overrite conditions to
$conditions = $Model->data[ $Model->name ];
// Trim all array elements and filter out any empty indexes
$conditions = array_map( 'trim', $conditions );
$conditions = array_filter( $conditions );
// Get the remaining non-empty keys
$conditionKeys = array_keys( $conditions );
// Only query for record if all required keys are in conditions
if (empty( array_diff( $requireKeys, $conditionKeys ) )) {
return !$Model->hasAny( $conditions );
}
// NOTE: seems wrong to return true based on the assumption the category_id validation has probably failed
return true;
}
使用模型的 beforeValidate() 回调来检查字段是否存在以及它们是否为空。如果它们是空的,只需取消设置()模型验证 属性 中的 recordExists
验证规则。将它们复制到一个临时变量或 属性 如果你想在当前操作后将它们重新设置。
并且使用 $Model->alias
,如果通过具有不同名称的关联使用模型,name
将会中断。
$conditions = $Model->data[ $Model->name ];
我编写了一个自定义规则方法,用于在添加新记录之前验证数据库中是否存在记录。我把这个方法放在一个行为中,这样我就可以与其他模型共享它,但是我 运行 陷入了先有鸡还是先有蛋的局面。
为了知道一个类别是否已经有一个特定的组名,我需要有类别 ID 和组名。所以我通过使用我的自定义规则(category_id 和名称)传递这些键。但是,这是行不通的,因为如果我没有错误地选择 category_id,那么查询只会出现在名称上,所以我用几行修补了它,但需要 return true如果是这种情况,银行认为 category_id 验证无效。
有没有更好的方法来实现这种验证?这不是我想的那么糟糕吗?或者只是不要打扰,如果它通过,在我的控制器中将 hasAny() 放在我对 validates() 的调用下。
MODEL:
public $validate = [
'category_id' => [
'rule' => 'notEmpty',
'message' => 'Category is required.'
],
'name' => [
'notEmpty' => [
'rule' => 'notEmpty',
'message' => 'Team is required.'
],
'recordExists' => [
'rule' => [ 'recordExists', [ 'category_id', 'name' ] ],
'message' => 'Group already exists.'
]
]
];
// BEHAVIOR:
public function recordExists( Model $Model, $conditions, $requireKeys )
{
// Overrite conditions to
$conditions = $Model->data[ $Model->name ];
// Trim all array elements and filter out any empty indexes
$conditions = array_map( 'trim', $conditions );
$conditions = array_filter( $conditions );
// Get the remaining non-empty keys
$conditionKeys = array_keys( $conditions );
// Only query for record if all required keys are in conditions
if (empty( array_diff( $requireKeys, $conditionKeys ) )) {
return !$Model->hasAny( $conditions );
}
// NOTE: seems wrong to return true based on the assumption the category_id validation has probably failed
return true;
}
使用模型的 beforeValidate() 回调来检查字段是否存在以及它们是否为空。如果它们是空的,只需取消设置()模型验证 属性 中的 recordExists
验证规则。将它们复制到一个临时变量或 属性 如果你想在当前操作后将它们重新设置。
并且使用 $Model->alias
,如果通过具有不同名称的关联使用模型,name
将会中断。
$conditions = $Model->data[ $Model->name ];