为什么我在 laravel 8 中添加验证后此代码会失败?

Why does this code Fail once i add validation in laravel 8?

我刚开始学习Laravel,我在这里有点迷路。此代码无需验证即可工作。

任务是建立一个用户注册的网站,将数据发布到现有的数据库中。正如我所指出的,没有验证它工作得很好但是当我添加验证时它失败了。


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Member;

class RegController extends Controller
{
    public function store(Request $request) {


        Member::create([

        'fname' => $request ->fname,
        'lname' => $request ->lname,
        'gender' => $request ->gender,
        'msisdn' => $request ->msisdn,
        'email' => $request ->email,
        'status' => $request ->mstatus,
        'no_of_children' => $request ->kids,
        'occupation' => $request ->profession,
        'age' => $request ->age,
        'bna' => $request ->bna,
        'residence' => $request ->residence,
        ]);
        
        return redirect('/members/register');
    
       }
}

但这并不...


namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Member;

class RegController extends Controller
{
    public function store(Request $request) {

        $request->validate([
            'fname' => 'required',
            'lname' => 'required',
            'gender' => 'required',
            'msisdn' => 'required|unique:members_tbl',
            'email' => 'required|unique:members_tbl',
            'status' => 'required',
            'kids' => 'required',
            'profession' => 'required',
            'age' => 'required',
            'bna' => 'required',
            'residence' => 'required',
        ],
        [
            'fname.required' => 'Please Enter your First Name',
            'lname.required' => 'Please Enter your Last Name',
            'gender.required' => 'Please Enter your Gender',
            'msisdn.required' => 'Please Enter your Phone Number',
            'msisdn.unique' => 'A user has already registered with the phone Number',
            'email.unique' => 'A user has already registered with the email',
            'email.required' => 'Please enter a valid email address',
            'status.required' => 'Please Let us know your marital status',
            'kids.required' => 'Please fill out this field',
            'profession.required' => 'Please fill out this field',
            'age.required' => 'Please fill out this field',
            'bna.required' => 'Please fill out this field',
            'residence.required' => 'Please let us know where you live',
        ]);


        Member::create([

        'fname' => $request ->fname,
        'lname' => $request ->lname,
        'gender' => $request ->gender,
        'msisdn' => $request ->msisdn,
        'email' => $request ->email,
        'status' => $request ->mstatus,
        'no_of_children' => $request ->kids,
        'occupation' => $request ->profession,
        'age' => $request ->age,
        'bna' => $request ->bna,
        'residence' => $request ->residence,
        ]);
        
        return redirect('/members/register');
    
       }
}

我错过了什么?该代码在没有验证的情况下运行良好,但在添加验证时仅重定向回表单。

这是我的模特

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    use HasFactory;

    public $timestamps = false;

    protected $table="members_tbl";

    protected $fillable =[
        'fname',
        'lname',
        'gender',
        'msisdn',
        'email',
        'status',
        'no_of_children',
        'occupation',
        'age',
        'bna',
        'residence'
    ];
}

这是var_dump($request)

的结果
 public 'request' => 
    object(Symfony\Component\HttpFoundation\InputBag)[44]
      protected 'parameters' => 
        array (size=13)
          '_token' => string 'DuNeITGaDF9K7eEMmU4HwX7nVLJUYDaZ1iYGT4dw' (length=40)
          'fname' => string 'Joe' (length=3)
          'lname' => string 'Peski' (length=5)
          'gender' => string 'male' (length=4)
          'msisdn' => string '254722000001' (length=12)
          'email' => string 'joetry@hotmail.com' (length=18)
          'residence' => string 'New Place' (length=9)
          'age' => string 'teen' (length=4)
          'bna' => string 'no' (length=2)
          'mstatus' => string 'single' (length=6)
          'kids' => string '4' (length=1)
          'profession' => string 'IT' (length=2)
          'submit' => string 'Submit' (length=6)

我相信它正在按预期工作。如果您不使用旧值重新填充字段,那么看起来页面只是被重定向了。您还需要在页面上显示验证消息。

https://laravel.com/docs/8.x/validation#repopulating-forms

https://laravel.com/docs/8.x/validation#quick-displaying-the-validation-errors

验证器没有读取您的 status。确保您有此字段的默认值。

如果不需要status,可以将required改为nullable,验证后创建默认值。

您需要 display an error message 才能知道错误是什么。

$errors = $validator->errors();

通常,当您使用 select 框、复选框或无法读取值或为空、null 的东西时,就会出现这种情况。

解决办法是加一个默认值或者加一个带默认值的隐藏字段

<input type="hidden" name="status" value="0">
<select name="status">
    ...
</select>