【问题标题】:What is the Laravel way to check if the POST Request has a field left empty?Laravel 检查 POST 请求是否有一个字段留空的方法是什么?
【发布时间】:2018-09-04 06:46:45
【问题描述】:

要求是更新用户角色。角色可以为空(留空)、一个或多个,如表单字段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

UserController::update()里面的条件是:

if ($request->roles) {
    // update user roles
}

除了一种情况外,一切正常。有时用户必须保持没有任何角色。

if($request-&gt;roles)isset($request-&gt;roles)!empty($request-&gt;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"
      ]
    ]
  }

案例:当没有分配角色或需要移除(分离)之前分配的角色时

  +request: ParameterBag {#41 ▼
    #parameters: array:5 [▼
      "_method" => "PUT"
      "_token" => "a8oIPQFBMbhjanikX8v83qeOcfRE0N4UKTcTQDig"
      "name" => "New User Name"
      "email" => "newuser@testserver.asap"
      "password" => ""
    ]
  }

所以问题(要求)是:

如何区分HTML Post表单的字段值已提交为空(此处未选中)或视图表单中没有该字段? Laravel 中是否有一种 eloquent* 的方式来查找/列出来自 Request 对象的表单文件?

[PS:尝试另一个隐藏字段或做一些前端jQuery将不受欢迎]

【问题讨论】:

  • 我认为 isset($request->roles) 可以很好地检查是否有任何角色从表单提交
  • 你试过了吗? $request->has('roles')
  • $request-&gt;has('roles') 给出了相同的结果!
  • isset($request-&gt;roles) 说真或假,我怎么知道什么时候有一个字段但仍然是空的? @ashokpoudel
  • 请记住检查答案是否正确,以便问题关闭,其他用户可以将答案识别为他们问题的解决方案。谢谢。

标签: php laravel validation laravel-5 postdata


【解决方案1】:

您可以使用 laravel 请求方法 has()filled()has 检查参数是否存在,filled 检查参数是否存在填充:

if ($request->has('roles')) {
    //
}

if ($request->filled('roles')) {
    //
}

查看Laravel documentation 了解有关从请求对象检索输入的更多详细信息。

编辑

由于您使用的是 Laravel 5.2,因此适用以下规则:

  • has() 方法检查参数是否存在填充。
  • exists() 方法检查参数是否存在。

查看代码库上的the code 了解更多信息。

【讨论】:

  • filled() 不适用于 5.5 以下的版本。我认为这是正确的做法。不幸的是,我仍然使用 Laravel 5.2。 $request-&gt;has('roles')isset($request-&gt;roles) 相同
  • @EazySam 我已经更新了答案,添加了 5.2 信息 :)
【解决方案2】:

为此,您有validations,似乎您需要roles 字段为requiredexists(映射到某个表)

您只需通过 artisan 命令制作验证器并将其注入控制器方法中,查看文档。

例如: php artisan make:request MyCustomRequest 然后你应该有一个请求文件:App\Http\Requests 您需要按上述方式设置验证规则:

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class MyCustomRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'rules' =>'required|exists:tour_roles_table,id'
        ];
    }
}

然后你可以用你想要的方法注入它:

class UserController extends Controller {
[...]
    public function update(MyCustomRequest $req)
    {
     [...]
     //at this point validation was successfull, by default Laravel will redirect back with error messages, which can be customized in your request object
    }
[...]
}

【讨论】:

  • 这绝对看起来像是一项验证工作。
  • 在这种情况下角色是可选的,因此通过验证要求它们不是最好的解决方案。
  • @Asur Tou 也可以通过sometimes 规则将字段设置为可选
  • requiredexist 都没有帮助(
  • 当然可以,但是他需要在条件中添加逻辑,因此您可以通过验证来做到这一点的唯一方法是检查errorsBag,IMO 会为一个非常简单的问题增加不必要的复杂性
【解决方案3】:

您需要在应用程序的设计中确定此问题。

如何区分 HTML Post 表单的字段值已提交为空(此处未选中)或视图表单中没有该字段? Laravel 中是否有一种 eloquent* 的方式来从 Request 对象中查找/列出表单文件?

什么时候该表单不应该有roles[] 字段?您应该有一个标记,告诉您的应用程序该表单没有roles[] 字段。

例如,当普通用户在更新他/她的个人资料时使用此表单时,他/她将无法更新他/她的角色。

因为你的问题确实是表单的默认行为,正如这个问题所回答的:Submit an HTML form with empty checkboxes

因此对于没有有角色字段的表单和角色字段的表单会有不同的流程。

要添加到您的实现中,您可以像这样检索角色字段:

$roles = $request->input('roles', []);

之后,您可以将sync 用于模型的关系方法。

$user->roles()->sync($roles);

【讨论】:

  • 是的,这有帮助,$request-&gt;input('roles', []) 会做到的。
  • 不存在这样的情况:表单不应该有角色[]。我别无他法,只能提出这样的问题。
【解决方案4】:

试试 if(empty())

$check = request::get('roles');

if(empty($checkbox)){
  //if checkbox have a empty value do ...
}else{
  //if checkbox have not empty value do .. 
}

更多信息请点击http://php.net/manual/en/function.empty.php

【讨论】:

  • 是/否-真/假! empty()isset() 在这里都给出了相同的结果。
猜你喜欢
  • 1970-01-01
  • 2020-06-05
  • 1970-01-01
  • 2015-05-27
  • 2011-01-17
  • 2020-11-30
  • 2017-07-02
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多