2016-01-21 77 views
2

我有一些驗證,需要一個url 一條路線,但兩者。Laravel驗證或

$this->validate($request, [ 
     'name' => 'required|max:255', 
     'url' => 'required_without_all:route|url', 
     'route' => 'required_without_all:url|route', 
     'parent_items'=> 'sometimes|required|integer' 
    ]); 

我一直在使用required_withoutrequired_without_all但是他們都讓過去的驗證嘗試,我不知道爲什麼。

route是在route領域

+0

我只是用'required_without'試着和它的作品。你可以發佈你的'路線規則? 'return ['route'=>「required_without:url」,'url'=>「required_without:route | url」];'按我期望的那樣工作。 –

+0

@BenSwinburne看到下面的答案和我的評論,需要的是完全錯誤的東西:) – Ian

回答

3

我認爲最簡單的方法是創建您自己的驗證規則。它可能看起來像。

Validator::extend('empty_if', function($attribute, $value, $parameters, Illuminate\Validation\Validator $validator) { 

    $fields = $validator->getData(); //data passed to your validator 

    foreach($parameters as $param) { 
     $excludeValue = array_get($fields, $param, false); 

     if($excludeValue) { //if exclude value is present validation not passed 
      return false; 
     } 
    } 

    return true; 
}); 

而且使用它

$this->validate($request, [ 
    'name' => 'required|max:255', 
    'url' => 'empty_if:route|url', 
    'route' => 'empty_if:url|route', 
    'parent_items'=> 'sometimes|required|integer' 
]); 

附:不要忘記在你的提供商註冊。

編輯

添加自定義消息

1)添加信息 2)添加替代品

+0

完美!我今天早上意識到,required_if並非我所需要的,實際上是檢查_another_字段是否爲空,請感謝您的幫助 – Ian

+1

@Ian很高興聽到我幫助過你:) – xAoc

+0

規則有一個小問題關於消息,由於它是一個自定義的驗證規則,它不會在消息中做同樣的替換,如果我只是將它設置爲靜態消息,那麼它會出現兩次,因爲這兩個字段使用相同的角色,你會能夠擴展你的答案,包括消息?例如'如果以下情況,則不能填充字段:屬性:其他也被填充「?'最接近我追蹤的方法在'\ vendor \ laravel \ framework \ src \ Illuminate \ Validation \ Validator中。php' line 1680 – Ian

2

我認爲你正在尋找required_if規則:

下驗證字段必須如果anotherfield場等於任何值存在。

因此,驗證規則是:

$this->validate($request, [ 
    'name'  => 'required|max:255', 
    'url'   => 'required_if:route,""', 
    'route'  => 'required_if:url,""', 
    'parent_items'=> 'sometimes|required|integer' 
]); 

希望這有助於。快樂編碼。乾杯。

+0

不幸的是,這並沒有幫助,驗證仍然通過時,這兩個字段填充 – Ian

+0

@Ian只是一個想法:你爲什麼不使用jQuery?例如,如果用戶正在填寫「url」字段,則將'readonly'屬性添加到'route'字段,反之亦然。這樣,如果其中一個字段被填充,他們將無法填充數據。 –

+5

那麼他們可以只刪除該屬性,它仍然會通過服務器端,jQuery是**不是**的解決方案服務器端問題 – Ian