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]);
}

または、すべての検証ルールに bail-early チャンクのコードを追加します。

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 に答える