我在CakePHP应用程序中创建了一个简单的模型行为来处理文件上传。在beforeValidate()
方法中,我有以下内容:
public function beforeValidate(Model $Model, $options = array()) {
$maxFileSize = '1MB';
$Model->validator()->add($this->settings[$Model->alias]['field'], array(
'extension' => array(
'rule' => array('extension', $this->settings[$Model->alias]['allowedExtensions']),
'message' => __('Please supply a valid image'),
'allowEmpty' => ($this->settings[$Model->alias]['required'] === false)
),
'fileSize' => array(
'rule' => array('fileSize', '<=', $maxFileSize),
'message' => __('Image must be less than %s', $maxFileSize)
),
'uploadError' => array(
'rule' => 'uploadError',
'message' => __('Something went wrong with the upload')
)
));
return true;
}
我正在动态添加与文件字段相关的验证。第一条规则是检查扩展是否在行为设置中传递的允许扩展数组中,并且我有一个等同于allowEmpty
的{{1}}密钥,因为在这种情况下文件上载不是强制性的。
此行为附加到true
类。编辑活动时,即使我已将Event
指定为allowEmpty
,扩展程序验证规则也会启动。这是为什么?
是因为在文件字段中传递的数据是一个数组,实际上等于非空,因此验证正在进行中吗?如果是这样,我怎么打击这个?如果实际上传了一个文件,我只想要验证。
答案 0 :(得分:2)
是因为在文件字段中传递的数据是一个数组并且实际上等同于非空,因此验证正在进行中吗?
是。如果没有上载文件,则模型字段的数组键仍将存在,并且值为非空值。即类似的东西:
//$request->data
array(
'Model' => array(
'field' => array(
...
'size' => 0,
'error' => 4
)
)
);
为了防止验证文件上传字段的问题 - 一个简单的选项是检查UPLOAD_ERR_NO_FILE并擦除相关的模型数据。在beforeValidate回调中,可能如下所示:
$field = $this->settings[$Model->alias]['field'];
if (
isset($Model->data[$Model->alias][$field]['error']) &&
$Model->data[$Model->alias][$field]['error'] === UPLOAD_ERR_NO_FILE
) {
unset($Model->data[$Model->alias][$field]);
}
或者在所有验证规则中添加一个早期保释代码:
function validateExt($Model, ...) {
$field = $this->settings[$Model->alias]['field'];
if ($Model->data[$Model->alias][$field]['error'] === UPLOAD_ERR_NO_FILE) {
return true;
}
...
}
这样即使使用空文件上传调用,验证规则也不会返回错误否定。顺便提一下,验证规则顺序很重要,在验证上传内容之前检查上传错误会更有意义=。