Yii2。将maxSize验证器应用于特定文件扩展名的更好方法?

时间:2017-12-13 06:34:26

标签: yii2

我的一个名为file的模型字段必须验证如下:

  1. 它必须是一个文件
  2. 它应该只有以下扩展名:txt,png,jpg,jpeg,gif。
  3. 如果它是txt文件,则其大小不应超过100 KB。
  4. 虽然很容易实现第一个和第二个规则,但实现第三个规则是隐含的。我在rules方法中写了一个通用规则,确保它是一个文件,它是允许的扩展之一:

            [
                ['file'],
    
                'file',
                'extensions' => ['txt', 'png', 'jpg', 'jpeg', 'gif'],
                'checkExtensionByMimeType' => false,
            ],
    

    然后,我在我的模型saveFile方法中写了这个,当需要保存文件时调用它(即在调用validate方法后调用它):

            if ($this->file->getExtension() === 'txt') {
                $tempModel = DynamicModel::validateData(['file'], [
                    [['file'], 'file', 'maxSize' => 1024 * 100],
                ]);
    
                $tempModel->file = $this->file;
    
                if (!$tempModel->validate()) {
                    // putting the error to the main model
                    // so it can be shown
                    $this->addErrors($tempModel->getErrors());
    
                    return false;
                }
    
                $this->file->saveAs($this->pathToNewFile());
            }
    

    虽然它有效但代码似乎很重,所以我想知道是否有更好的方法来做到这一点,谢谢!

    P.S。 here是我的模型的完整代码,here是我的控制器的代码,以备不时之需。

1 个答案:

答案 0 :(得分:2)

要实现第三条规则的功能,可以在rules()中输入:

[['file'], 'file', 'maxSize' => 1024 * 100, 'when'=>function($model){
return $model->file->extension == 'txt';}]

要了解有关条件变体的详情,请参阅此链接中的条件验证部分http://www.yiiframework.com/doc-2.0/guide-input-validation.html