1

我在我的 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等同于的键,true因为在这种情况下文件上传不是强制性的。

此行为附加到一个Event类。编辑事件时,扩展验证规则会启动,即使我已指定allowEmptytrue. 为什么是这样?

是不是因为文件字段中传递的数据是一个数组并且实际上等同于非空,因此验证正在启动?如果是这样,我该如何对抗?如果文件实际已上传,我只想进行验证。

4

1 回答 1

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;
    }
    ...
}  

这样即使使用空文件上传调用验证规则也不会返回误报。顺便说一句,验证规则顺序很重要,在验证上传内容之前检查上传错误会更有意义=)。

于 2013-10-28T14:57:52.640 回答