我想创建一个表单请求验证,但不知道如何操作。
我有一个表格:
<form>
<input type="text" name="fullname[0]">
<input type="text" name="document_num[0]">
<input type="text" name="fullname[1]">
<input type="text" name="document_num[1]">
<input type="text" name="fullname[2]">
<input type="text" name="document_num[2]">
.....
<input type="text" name="fullname[n]">
<input type="text" name="document_num[n]">
<input type="submit">
</form>
表'用户':
id | fullname | document_num
1 | John | 111
2 | Jane | 112
.. | ... | ...
当用户点击提交时,请求被发送到控制器方法,在那里它首先被表单请求验证(或者它可以是一个常规的验证器)。所以我想写一个规则来检查:
for (i=0; i<numberOfUsersToAdd; i++)
if (‘document_num[$i]’ exists in ‘users’ in field ‘document_num’ ) {
$user = Users::find(id of user in DB having this ‘document_num[$i]’) ;
check if (fullname[$i] == $user->fullname) {
return true} // input-ed users name match his/her name in DB.
else {return false} // input-ed users name doesn't match his/her name in DB.
}
else return true; // document_num[$i] doesn't exists in the database which's ok
如果在单词中:检查表 users 中是否存在任何输入的 document_num[$i],如果是,则从 DB 中获取具有此 document_nubmer 的用户,并将他/她的全名值与输入的 fullname[$i] 进行比较。
怎么做?:)
感谢任何帮助!:)
好的。此验证的逻辑YourFormRequest
是下一个:
document_num
字段附加为整数。您可以添加其他附加约束 - 没关系。rules
方法中YourFormRequest
“给定的用户是否存在document_num
?”。fullname
。如果等于则确定 - 该字段的验证成功。否则,如果它失败,则将您的自定义规则附加到该字段,该规则总是失败。让我们在一个工作示例中看看这种方法。
你的表单请求.php
public function rules()
{
$rules = [
'fullname.*' => 'required',
'document_num.*' => 'required|integer',
];
$documentNums = request()->get('document_num');
$fullnames = request()->get('fullname');
for ($i = 0; $i < count($documentNums); $i++) {
$user = User::where('document_num', $documentNums[$i])->first();
if ($user && ($user->fullname != $fullnames[$i]) {
$rules['document_num.' . $i] = "document_num_fail:$i"; //some rule that always fails. As argument we pass a row number of field that fails
}
}
return $rules;
}
CustomValidator.php(例如将其放在 App\Services 文件夹中)
namespace App\Services;
class CustomValidator {
public function documentNumFailValidate($attribute, $value, $parameters, $validator) {
return false;
}
public function documentNumFailReplacer($message, $attribute, $rule, $parameters) {
return str_replace([':index'], $parameters[0], $message);
}
}
在这里你可以看到两个函数。首先 - 验证规则(我们总是传递错误,因为我们需要它)。第二 - 它只是错误信息的替代品。您想知道此错误出现在哪个字段行上(例如分别在第三行和字段:fullname[2] 和 document_num[2])。正如我在上面关于附加失败规则的评论中所写的那样,我们给出了验证方法失败的行数(documentNumFailReplacer
方法将用给定的值替换错误消息中的占位符:索引)
下一步 - 在 AppServiceProvider.php 中注册此方法
public function boot()
{
Validator::extend('document_num_fail', 'App\Services\CustomValidator@documentNumFailValidate');
Validator::replacer('document_num_fail', 'App\Services\CustomValidator@documentNumFailReplacer');
}
最后一步 - 在validation.php 中定义您的自定义消息
'custom' => [
'document_num.*' => [
'document_num_fail' => 'Input-ed user name doesn`t match his/her name in DB for specified :attribute (field position/number: :index)',
]
],
'attributes' => [
'document_num.*' => 'document number',
],
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句