Laravel 检查 POST 请求是否有字段留空的方法是什么?

What is the Laravel way to check if the POST Request has a field left empty?

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

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

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

所以问题(要求)是:

如何区分 HTML Post 表单的字段值已提交为空(此处未选中)或视图中是否没有此类字段表格? 是否有 eloquent* 方法 Laravel 到 find/list 从 Request 对象提交的表单?

[PS: 尝试另一个隐藏字段或做一些前端 jQuery 将不被赞赏]

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

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

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

检查 Laravel documentation 以获取有关从请求对象检索输入的更多详细信息。

编辑

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

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

查看存储库 the code 了解更多信息。

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

你只需要通过 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
    }
[...]
}

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

How to differentiate when the field value of an HTML Post form has been submitted as empty(unchecked here) or if there was no such a field in the view form? Is there an eloquent* way in Laravel to find/list the form fileds from the Request object?

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

比如,当普通用户更新 his/her 个人资料时使用此表单,he/she 将无法更新 his/her 角色。

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

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

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

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

之后你可以直接使用sync你模型的关系方法。

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

尝试 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