2016-03-14 91 views
0

我在尋找完成此任務的最佳路線的建議。Laravel檢索並驗證多個輸入

用戶註冊後,它們被帶到2個步驟的菜單。第一步是從複選框列表中進行選擇(這是所有設置和工作),然後根據他們選擇的複選框,在第二步中,他們有一組文本輸入以像關鍵字那樣輸入。

如果他們選中「遊戲」複選框,則會顯示。

<input type="text" name="gameInfo[]" class="form-control input-global"/> 
<input type="text" name="gameInfo[]" class="form-control input-global"/> 

如果他們選擇「藝術」複選框,這將顯示出來。

<input type="text" name="artInfo[]" class="form-control input-global"/> 
<input type="text" name="artInfo[]" class="form-control input-global"/> 

因此,對於不同的陣列可以有多個文本輸入。我們的目標是採取文本輸入中的任何內容,並將其保存到我的數據透視表中,該表還引入了user_id和type_id(涉及遊戲,藝術等)。數據透視表已經準備就緒,我只是創建了一個額外的列(type_details)來接受這些文本輸入。

這是我的控制器。我認爲我可以使用以下內容,但會檢查它是否存在並且不是空白。如果用戶提交一個空白表格,那麼「有」將無法捕捉它。

if ($request->has('gameInfo') 
{ // code here } 

如果我可以使用每個陣列(的GameInfo,ARTINFO等)這種類型的邏輯,我認爲會解決這個問題,但我似乎無法得到它的工作。

控制器:

$gameInfo = Input::get('gameInfo'); 
$artInfo = Input::get('artInfo'); 
$musicInfo = Input::get('musicInfo'); 
$buildingStuffInfo = Input::get('buildingStuffInfo'); 
$educationalInfo = Input::get('educationalInfo'); 

if ($request->has($gameInfo)) 
{ 
    $this->validate($request, [ 
     'gameInfo' => 'required', 
    ], [ 
     'required' => 'You must enter information on the games.', 
    ]); 
} 

if ($request->has($artInfo)) 
{ 
    $this->validate($request, [ 
     'artInfo' => 'required', 
    ], [ 
     'required' => 'You must enter information on the art.', 
    ]); 
} 

謝謝!

UPDATE:

相反,我打算把輸入的名字,像這樣。

<input type="text" name="typeDetails[games]" class="form-control input-global"/> 
<input type="text" name="typeDetails[art]" class="form-control input-global"/> 

JS:

var data = { 'typeDetails[games]' : [], 'typeDetails[art]' : [] }; 

$("input[name='typeDetails[games]']").each(function() { 
    data['typeDetails[games]'].push($(this).val()); 
}); 

$("input[name='typeDetails[art]']").each(function() { 
    data['typeDetails[art]'].push($(this).val()); 
}); 

然而,在我的控制器,它只能抓住陣列的「遊戲」部分,不繼續檢查的「藝術」部分。

$typeDetails = Input::get('typeDetails');    

if ($request->has('typeDetails.games')) 
{ 
    return 'games'; 
} 

if ($request->has('typeDetails.art')) 
{ 
    return 'art'; 
} 
+0

那些陣列所以在驗證它應該是'的GameInfo *'https://laravel.com/docs/5。2/validation#validating-arrays,如果用戶將不得不使用3個信息之一(遊戲,藝術,音樂),那麼你可以使用一個變量,然後在驗證中調用它以避免重複碼。 – ctf0

+0

請看看這個鏈接:http://ericlbarnes.com/2015/04/04/laravel-array-validation/ 你想要驗證的是一個數組,它應該以不同的方式處理。 – user3613129

+0

正如鏈接中所建議的,將驗證從控制器移到Requests類是明智的。這會讓你的控制器不那麼混亂。 – user3613129

回答

0

你可以做類似如下:

$this->validate($request, [ 
    'gameInfo.*' => 'sometimes|array', 
    'artInfo.*' => 'sometimes|array', 
    // etc 
]); 
0

你爲什麼不使用標準Laravel方式?只需使用custom Request class來驗證每個表單,並使用fill()類來一次性填充具有所有經過驗證的輸入的模型。

驗證:驗證後

public function rules() 
{ 
    return [ 
     'title' => 'required|unique|max:255', 
     'email' => 'required|email|unique:users' 
    ]; 
} 

灌裝:

$info = new Info(); 
$info->fill($request->all());