我的一个名为file
的模型字段必须验证如下:
虽然很容易实现第一个和第二个规则,但实现第三个规则是隐含的。我在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());
}
虽然它有效但代码似乎很重,所以我想知道是否有更好的方法来做到这一点,谢谢!
答案 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