【问题标题】:Conditional validation if checkbox selected laravel如果复选框选择了 laravel,则进行条件验证
【发布时间】:2016-07-10 15:27:21
【问题描述】:

我在 Laravel 中有一个表单,我想在其中基于一个复选框来验证三个文本字段。它是一个编辑用户表单,如果我选择是,我只想在其中更新密码。这是我认为的形式:

<section>
    <div class="form">
        <h1>Edit: {!! $user->name !!}</h1>
        {!! Form::model($user, ['method' => 'PATCH', 'action' => ['AccountController@update', $user->id], 'files' => true]) !!}
        <p>Name: {!! Form::text('name') !!}
        <p>Email: {!! Form::text('email') !!}
        <p>Update Password? (tick for yes) &nbsp; {!! Form::checkbox('updatepasswordcheck', 0, false) !!}
        <p>Old Password: {!! Form::password('oldpassword') !!} 
        <p>New Password: {!! Form::password('newpassword') !!}
        <p>New Password Confirm: {!! Form::password('newpasswordconfirm') !!}
        @if($user->role_id == 1) 
            <p>User Role: {!! Form::select('user_type', ['admin', 'guest'], '1') !!}
        @else
            <p> User Role: {!! Form::select('user_type', ['admin', 'guest'], '0') !!}
        @endif
        <p>{!! Form::submit('Update') !!}
        {!! Form::close() !!}
        @include ('errors.list_errors')
    </div>
</section>

然后我有一个名为 EditAccountRequest 的请求,如下所示:

<?php

namespace App\Http\Requests;

use App\Http\Requests\Request;

class EditAccountRequest extends Request
{
    /**
     * 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()
    {
      

        if($this->inputs['updatepasswordcheck'])
        {
            $rules['oldpassword'] = 'required';
            $rules['newpassword'] = 'required';
            $rules['newpasswordconfirm'] = 'required';  
        }
        $rules['name'] = 'required|min:3';
        $rules['email'] = 'required|email';
        
        return $rules;
    }
}

我的问题是,当我看到复选框“updatepasswordcheck”是否为真时,它永远不会起作用,因为输入总是显示为空。有谁知道如何解决这个问题?

【问题讨论】:

    标签: php validation laravel-5


    【解决方案1】:

    可能可以为此目的使用 required_unless:

    $this->validate($request, 
            [
                'content' => 'required_unless:otherfields,null',
            ],
            [
                'content.required_unless' => 'Please enter content for detail'
            ]);
    

    文档: https://laravel.com/docs/8.x/validation#rule-required-unless

    还有另一种方法可以查看有时规则。这将仅在字段可用时运行规则:

    文档: https://laravel.com/docs/5.3/validation#conditionally-adding-rules

    【讨论】:

      【解决方案2】:

      更简洁直接的解决方案

          $validated = $request->validate([
              .
              .
              .
              'newpasswordconfirm' => 'required|accepted',
              'oldpassword' => 'required',
              'newpassword' => $request->newpasswordconfirm === 'yes' ? 'required': 'nullable',
          ]);
      

      【讨论】:

        【解决方案3】:

        您可以在此示例中执行以下操作:

        public function rules(Request $request)
        {
            if($request->has('updatepasswordcheck'))
            {
                $rules['oldpassword'] = 'required';
                $rules['newpassword'] = 'required';
                $rules['newpasswordconfirm'] = 'required';  
            }
            $rules['name'] = 'required|min:3';
            $rules['email'] = 'required|email';
        
            return $rules;
        }
        

        【讨论】:

        • 我试过这样做,我得到了这个错误:目标 [App\Http\Requests\Request] 不可实例化。
        • 你需要在你的类之上和命名空间之下有以下内容,use App\Http\Requests\Request;
        • 不,仍然会出错,因为您在请求对象或其他东西中
        • 如果另一个不起作用,请使用Request::has()
        【解决方案4】:

        我使用的是 Laravel 5.5,这段代码运行良好,我的情况是如果“公司信息”下拉菜单选择“是”,那么应该需要“公司名称”。

        控制器:

        protected function validator(array $data)
        {
           return Validator::make($data, [
        
              'company_name' => 'required_if:is_company,1',
        
           ]);
        }
        

        查看:

        <label class="control-label">Company Info</label>
        <select id="is_company" class="form-control" name="is_company">
               <option value="0">No</option>
               <option value="1">Yes</option>
        </select>
        
        
        <label class="control-label">Company Name</label>
        <input type="text" class="form-control" name="company_name">
        

        More Detail

        【讨论】:

        • 如果我们使用复选框而不是下拉菜单怎么办?
        【解决方案5】:

        好的,我解决了。我这样做了,它有效:

        public function rules()
        {
                if($this->has('updatepasswordcheck'))
                {
                    $rules['oldpassword'] = 'required';
                    $rules['newpassword'] = 'required';
                    $rules['newpasswordconfirm'] = 'required';  
                }
                $rules['name'] = 'required|min:3';
                $rules['email'] = 'required|email';
        
                return $rules;
        }
        

        【讨论】:

          猜你喜欢
          • 2012-12-28
          • 1970-01-01
          • 1970-01-01
          • 2011-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多