Laravel 似乎没有在控制器中验证数据

Laravel does not seem to be validating data in the Controller

我制作了这个表格并将其添加到 Blade 中:

<form role="form" action="{{ route('client.stepOne') }}" method="POST" class="login-box" autocomplete="off">
  @csrf
  <div class="row">
    <div class="col-md-6">
      <div class="form-group BHoma">
        <label>Country:</label>
        <select class="form-select" aria-label="" disabled></object>
          <option value="ir" selected>ایران</option>
        </select>
      </div>
    </div>
    <div class="col-md-6">
      <div class="form-group BHoma">
        <label>
          <span class="required-input">*</span>&nbsp; Type phone number
        </label>
        <input autocomplete="off" class="form-control" name="phone" placeholder="مانند: 9121234567">
        @error('phone')
          <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
          </span>
        @enderror
      </div>
    </div>
  </div>
  <ul class="list-inline pull-right">
    <li>
      <button type="submit" class="default-btn next-step BJadidBold">ثبت و ادامه</button>
    </li>
  </ul>
</form>

在控制器中,我尝试将此作为方法:

public function stepOne(Request $request)
{
    // dd($request);
    $validData = $request->validate([
        'phone' => 'required'
    ]);
    
    User::create($validData);
    
    return redirect(route('auth.login'));
}

如您所见,我已指定需要输入 phone。所以如果用户没有输入任何phone数字,页面上肯定会出现错误信息(我已经定义了@error('phone')...@enderror)。

但是现在当用户没有输入任何值 phone 时它不会显示错误。

但是,如果我取消注释 dd($request),我可以正确地获得结果,这意味着该方法已正确连接为表单操作。

那么这里出了什么问题?我该如何解决这个问题?


更新:

dd($validData)returns这个:

array:1 [▼
  "phone" => "2321312"
]

如果我没有输入任何内容并将其留空,则不会显示任何内容。

您可以尝试这样做:

$validData = $request->validate([
    'phone' => ['required', 'numeric', 'digits:10'],
]);

numeric 只接受数字,并输入 10 位数字作为有效的 phone 数字

基于 上的这个问题和评论似乎无效-反馈在这里效果不佳

你可以用这个

@error('phone')
<div class="text-danger">
{{ $message }}
</div>
@enderror


如果您查看为 .invalid-feeback 生成的 Bootstrap CSS 规则,您会看到:

.invalid-feedback {
  display: none;
  width: 100%;
  margin-top: 0.25rem;
  font-size: 0.875em;
  color: #dc3545;
}

.was-validated :invalid ~ .invalid-feedback,
.was-validated :invalid ~ .invalid-tooltip,
.is-invalid ~ .invalid-feedback,
.is-invalid ~ .invalid-tooltip {
  display: block;
}

换句话说,该元素只有在其兄弟元素具有 .is-invalid class 时才会显示,(或者父元素具有 .was-validated 并且兄弟元素被标记为无效.) 你应该修改你的 Blade 代码如下:

<div class="form-group BHoma">
    <label>
        <span class="required-input">*</span>&nbsp; Type phone number
    </label>
    <input autocomplete="off" class="form-control @error('phone') is-invalid @enderror" name="phone" placeholder="مانند: 9121234567">
    @error('phone')
        <span class="invalid-feedback" role="alert">
            <strong>{{ $message }}</strong>
        </span>
    @enderror
</div>

以便在出现错误时为输入元素提供适当的class。