2017-05-22 41 views
0

我想爲我的管理面板添加一些自定義驗證邏輯,用於文件上傳。現在我的文件字段可以返回Illuminate\Http\UploadedFilestring|null,如果文件沒有上傳或更改或任何其他。所以,我做什麼,我創建了一個自定義規則,看起來像這樣:將自定義條件驗證規則添加到相同的屬性

'image' => [ 
       'required', 
       'admin_file:mimes:jpeg;png,dimensions:min_width=800;min_height=600' 
      ] 

我然後解析所有我傳遞參數,而事實是,我自然希望所有的人都適用只有我值是UploadedFile的一個實例。我用下面的代碼爲我的自定義驗證:

class AdminFileValidator 
{ 
    public function validate($attribute, $value, $parameters, Validator $validator) 
    { 
     $rules = implode(
      "|", 
      array_map(function($item) { 
       return str_replace(";", ",", $item); 
      }, $parameters) 
     ); 

     $validator->sometimes($attribute, $rules, function() use ($value) { 
      return $value instanceof UploadedFile; 
     }); 

     return true; 
    } 
} 

的問題是,通過sometimes增加額外的規則屬性不會按照這種方式,這些添加的規則不被供驗證處理。

我想問,有沒有什麼辦法來驗證這些規則沒有手動重新驗證整個事情?

+0

它誠實是沒有意義的,你爲什麼會想爲此創建一個自定義驗證器。 Laravel附帶'file'規則來檢查文件是否成功上傳。還有一些規則可供選擇。 – Sandeesh

+0

我需要驗證許多不同類型的文件。像文件,圖像,圖像+ pdf等。和MIME規則只接受'UploadedFile'實例,並失敗,如果我傳遞字符串(我無法合理避免,因爲一切都包裹到'FormRequest') – Eternal1

+0

所以你想要一個字符串值被成功處理,而不是拋出一個錯誤?據我所知,規則'文件','mimetypes','mimes'以及'有時候'正好是你所需要的,除了字符串的限制。我不確定你是如何在一個表單文件輸入中得到一個字符串的。 – Sandeesh

回答

0

我看到的是,您在規則中使用sometimes。從我的角度來看,你需要把它拿出來,甚至在沒有使用自定義類的情況下更好。

使用Validator對象:

$validator = Validator::make($data, [ 
    'image' => 'required', 
]); 

$validator->sometimes('image', 'mimes:jpeg;png,dimensions:min_width=800', function($value) { 
    return $value instanceof UploadedFile; 
}); 

如果您使用的是Request類,你可以重寫功能getValidatorInstance爲了應用條件的規則:

protected function getValidatorInstance(){ 
    $validator = parent::getValidatorInstance(); 

    $validator->sometimes('image', 'mimes:jpeg;png,dimensions:min_width=800', function($value) { 
     return $value instanceof UploadedFile; 
    }); 

    return $validator; 
}