Yii 2如何在文件上传中添加自定义验证检查

时间:2018-02-20 15:53:37

标签: php yii yii2 yii2-basic-app yii-components

我正在构建CSV上传器,我想添加一个自定义验证功能,该功能将检查CSV文件的标题行,以确保正确的列就位。

我试图在模型中放置一个自定义验证规则来执行此操作但在第一个障碍时失败。

我正在

  

设置未知属性:yii \ validators \ FileValidator :: 0

异常,但据我在文档中可以看出这应该有用。

Model

/**
* UploadForm is the model behind the upload form.
*/
class UploadForm extends Model
{
/**
 * @var UploadedFile file attribute
 */
public $file;

/**
 * @return array the validation rules.
 */
public function rules()
{
    return [
        [['file'], 'file', 'extensions' => 'csv', 'checkExtensionByMimeType'=>false, 'headerCheck', 'skipOnEmpty' => false]
    ];
}

public function attributeLabels(){
    return [
        'file'=>'Select csv'
    ];
}

 function headerCheck($attribute, $params, $validato){

    $this->addError($attribute, "error");
}
}

Controller 功能:

     public function actionUpload()
{
    $model = new UploadForm();

    if (Yii::$app->request->isPost) {
        $model->file = UploadedFile::getInstance($model, 'file');
        $filename = $model->file->baseName . '.' . $model->file->extension;

        if ($model->file && $model->validate()) {
            $upload = $model->file->saveAs('uploads/'.$filename );

            if($upload){
                define('CSV_PATH','uploads/');
                $csv_file = CSV_PATH . $filename;
                $filecsv = file($csv_file);

                foreach($filecsv as $data){
                    $lines = explode(',',$data);
                    $t=1;
                }
            }
        }
    }

    return $this->render('csvUpload', ['model' => $model]);
}

View

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

<?= $form->field($model, 'file')->fileInput() ?>

<button>Submit</button>

<?php ActiveForm::end() ?>

为什么headerCheck()没有被选为自定义验证功能?

1 个答案:

答案 0 :(得分:0)

简答

你的规则应该这样写:

return [
    [['file'], 'file', 'extensions' => 'csv', 'checkExtensionByMimeType'=>false, 'skipOnEmpty' => false],
    [["file"], "headerCheck"],
];

请注意,验证规则&#34; headerCheck&#34;是数组中的单独项目。

长答案

规则的结构是这样的:

[["attributes_to_validate"],"vaildatorCallback","param1"=>"value","param2"=>"value]

注意前两项分别是属性和回调,然后您可以指定应该分配给验证器的params,或者传递给验证器回调。这些参数是一种形式,其中键是属性的名称,值是分配给属性的值。

在您提供的示例中,Yii发现您想要使用&#34;文件&#34;验证器,因此它创建了yii \ validators \ FileValidator的实例。然后它会看到你想要参数&#34; extensions&#34;设置为&#34; csv&#34;,它确实如此:yii\validators\FileValidator::$extensions = "csv";但是,因为你已经在数组的这一部分中包含了自定义验证器,它认为&#34; headerCheck&#34;实际上是要分配给验证器的属性的值。因为你已经输入了这个&#34; param&#34;如果没有键,则键默认为0,因此Yii认为您要分配的属性称为&#39; 0&#39;。因此,Yii尝试这样做:yii\validators\FileValidator::0 = "headerCheck";

当然,没有财产&#39; 0&#39;在FileValidator上,以及你所得到的错误来自哪里。