2016-03-14 70 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());