Laravel如何检查POST请求中的字段是否为空?

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将不被赞赏]

Asu*_*sur 5

您可以使用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()方法检查参数是否存在。

检查仓库中的代码以获取更多信息。


Wre*_*igh 3

您需要在应用程序的设计中识别这个问题。

如何区分 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)