Eaz*_*Sam 3 php validation postdata laravel laravel-5
要求是更新用户角色。角色可以为空(左侧空白),也可以是一个或多个(如form字段中所提供)roles[]。
这是视图表单:
@foreach ($roles as $role)
<div class="checkbox">
<label><input name="roles[]" type="checkbox" value="{{$role->id}}" {{ $user->roles->contains($role->id) ? 'checked' : '' }}>{{$role->name}}</label>
</div>
@endforeach
Run Code Online (Sandbox Code Playgroud)
UserController :: update()中的条件是:
if ($request->roles) {
// update user roles
}
Run Code Online (Sandbox Code Playgroud)
除了一种情况,一切正常。有时,用户必须留下而没有任何角色。
if($request->roles),isset($request->roles)和!empty($request->roles)..都给予同样的老式回复(null,'',true/flase)。
案例:分配了一个或多个角色时:
+request: ParameterBag {#41 ?
#parameters: array:6 [?
"_method" => "PUT"
"_token" => "a8oIPQFBMbhjanikX8v83qeOcfRE0N4UKTcTQDig"
"name" => "New User Name"
"email" => "newuser@testserver.asap"
"password" => ""
"roles" => array:2 [?
0 => "2"
1 => "3"
]
]
}
Run Code Online (Sandbox Code Playgroud)
案例:当没有分配角色或需要删除(分离)先前分配的角色时:
+request: ParameterBag {#41 ?
#parameters: array:5 [?
"_method" => "PUT"
"_token" => "a8oIPQFBMbhjanikX8v83qeOcfRE0N4UKTcTQDig"
"name" => "New User Name"
"email" => "newuser@testserver.asap"
"password" => ""
]
}
Run Code Online (Sandbox Code Playgroud)
因此,问题(要求)为:
如何区分何时将HTML Post表单的字段值提交为空(此处未选中)或视图表单中没有这样的字段?
Laravel中有一种雄辩的方法可以从Request对象中查找/列出表单文件吗?
[PS:尝试另一个隐藏字段或使用一些前端jQuery将不被赞赏]
您可以使用laravel请求方法has()或filled(),has检查参数是否存在并filled检查其存在和填充:
if ($request->has('roles')) {
//
}
Run Code Online (Sandbox Code Playgroud)
要么
if ($request->filled('roles')) {
//
}
Run Code Online (Sandbox Code Playgroud)
查看Laravel文档以获取有关从请求对象检索输入的更多详细信息。
编辑
由于您使用的是Laravel 5.2,因此以下规则适用:
has()方法检查参数是否存在并已填充。exists()方法检查参数是否存在。检查仓库中的代码以获取更多信息。
您需要在应用程序的设计中识别这个问题。
如何区分 HTML Post 表单的字段值何时提交为空(此处未选中)或视图表单中是否没有此类字段?Laravel 中是否有一种雄辩的方法来查找/列出 Request 对象中的表单字段?
该表单什么时候不应该有字段roles[]?您应该有一个标记来告诉您的应用程序此表单没有字段roles[]。
例如,当普通用户更新他/她的个人资料时使用此表单时,他/她将无法更新他/她的角色。
因为您的问题确实是表单的默认行为,正如这个问题所回答的:Submit an HTML form withempty checkboxes
因此,对于没有角色字段的表单将有不同的流程,而对于有角色字段的表单将有不同的流程。
要添加到您的实现中,您可以像这样检索角色字段:
$roles = $request->input('roles', []);
Run Code Online (Sandbox Code Playgroud)
之后您就可以使用sync模型的关系方法。
$user->roles()->sync($roles);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6122 次 |
| 最近记录: |