【问题标题】:How to add validation for checkbox in laravel 5?如何在 laravel 5 中为复选框添加验证?
【发布时间】:2018-06-17 14:53:17
【问题描述】:

我有一个复选框数组,其中包括一个隐藏的复选框,因此如果未选中复选框,我可以发送一个值 0。

@foreach($records as $record)
<tr>
    <td>{{ $record->name }}</td>
    <td>{{ $record->id }}</td>

    <td>
        <input type="hidden" name="record_checkbox[{{ $loop->index }}]" value="0" />

        <input type="checkbox" class="form-control name="record_checkbox[{{ $loop->index }}]" value="1" />

    </td>
</tr>
@endforeach

我想验证在用户提交表单时发送01

在我的控制器中我尝试过使用这个:

$this->validate($request, [
    'record_checkbox[]' => 'integer|boolean|min:0|max:1',
]);

但是当我使用浏览器开发工具,手动将checkbox的value字段更新为100时,它仍然接受它并存储在数据库中。

那么我怎样才能通过适当的验证只允许01

【问题讨论】:

  • max1: 这是一个错字吗?我想应该是max:1
  • 但是为什么会有问题呢? Php 将始终将0 视为false,并将所有其他值视为true
  • 实际上,如果我在复选框的 value 属性中输入一些值,例如 50,100,它实际上存储的是该值而不是 1。

标签: laravel validation laravel-5


【解决方案1】:

如果要验证所有数组输入,请删除括号:

$this->validate($request, [
      'record_checkbox' => 'in:0,1',
]);

编辑

创建自定义规则:在app/Providers/AppServiceProvider.phpboot 方法下添加以下内容:

use Illuminate\Support\Facades\Validator;

...

public function boot() {

    Validator::extend('validate_checkboxes', function ($attribute, $values, $parameters, $validator) {

        foreach( $values as $value ) {
            if (!in_array($value, [0, 1])) {
                return false;
            }
            return true;
        }

    });

}

然后在你的控制器中:

$this->validate($request, [
      'record_checkbox' => 'validate_checkboxes',
]);

【讨论】:

  • 它在开始时可以工作,但又不能正常工作。可能是什么原因?
  • 尝试在没有$loop-&gt;index的情况下使用name=record_checkbox[]
  • 但我这样做是为了:stackoverflow.com/questions/48138165/…
  • 即使这样做后它仍然显示错误:所选记录复选框无效。
  • 所以如果你传递的值不是 1 或 0 它会存储在数据库中?到底是什么问题
【解决方案2】:

让我们试试:

use Illuminate\Validation\Rule;

$request->validate([
'record_checkbox[]' => [
    'required|in_array:[0, 1]'
    ]
]);

【讨论】:

  • 这并不能解决问题。它仍然接受像 50,100 这样的值并存储在表中
【解决方案3】:

大约一个月以来,我一直在努力寻找一个好的答案,我想我终于找到了一个好的解决方案,所以我会分享它。我有类似的东西,我有 3 或 4 个复选框字段来确定我的数据库中的微小 int 开关。我这样做的方法是在 app/Providers/AppServiceProvider.php 中添加这一行:

Validator::extendImplicit('checkbox', function($attribute, $value, $parameters, $validator)
    {
        $data = $validator->getData();
        $data[$attribute] = ($value == "1" || strtolower($value) == "true" || strtolower($value) == "on")? "1": "0";
        $validator->setData($data);
        return true;
    });

解释:

Validator::extendImplicit

这确保无论该属性是否在请求对象中(如果未选中它不会是)它仍然会运行此规则。

$data = $validator->getData();
$data[$attribute] = ($value == "1" || strtolower($value) == "true" || strtolower($value) == "on")? "1": "0";
$validator->setData($data);

一旦我们进入这个函数,我们将获取数据数组并将复选框的条目添加为 0 或 1(请注意,我没有更改请求对象,尽管您也可以使用类似 request- >merge() 或 request()->add()),然后设置新的数据数组。因此,在您的控制器中,您只需:

$data = $request->validate(['record_checkbox' => 'checkbox']);

您的数据数组将包含设置为 0 或 1 的字段“record_checkbox”。您现在可以使用此数组来填充()您的模型。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 2015-04-24
    • 2016-09-17
    • 2017-05-18
    • 2017-04-05
    • 2012-10-01
    相关资源
    最近更新 更多