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

时间:2018-03-26 07:32:43

标签: php laravel validation laravel-5 postdata

要求是更新用户角色。该字段可以为空(留空),一个或多个,如表单字段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表单的字段值是否已提交为空(在此处取消选中)或视图表单中是否存在此类字段? 在Laravel中是否有一种雄辩的方式来查找/列出来自Request对象的表单文件?

[PS:尝试另一个隐藏的领域或做一些前端jQuery将不胜感激]

4 个答案:

答案 0 :(得分:4)

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

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

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

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

修改

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

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

检查回购中的the code以获取更多信息。

答案 1 :(得分:2)

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

  

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

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

有些事情,当普通用户更新他/她的个人资料时使用此表格时,他/她将无法更新他/她的角色。

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

因此,不具备的表单将有一个不同的流程,其中已经一个角色字段的表单具有角色字段和不同的流程。

要添加到您的实现,您可以检索角色字段,如下所示:

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

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

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

答案 2 :(得分:1)

为此,您有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
    }
[...]
}

答案 3 :(得分:0)

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