试图验证何时不应该的模型行为

时间:2013-10-28 14:18:05

标签: cakephp model

我在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,扩展程序验证规则也会启动。这是为什么?

是因为在文件字段中传递的数据是一个数组,实际上等于非空,因此验证正在进行中吗?如果是这样,我怎么打击这个?如果实际上传了一个文件,我只想要验证。

1 个答案:

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

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