Php 使用jetstream在laravel 8中进行身份验证-用户名或电子邮件

Php 使用jetstream在laravel 8中进行身份验证-用户名或电子邮件,php,laravel,laravel-8,laravel-livewire,jetstream,Php,Laravel,Laravel 8,Laravel Livewire,Jetstream,我正在寻找一种解决方案,将标准Jetstream Auth更改为使用用户名或电子邮件进行身份验证。这意味着在注册帐户期间,您可以输入电子邮件或用户名(始终需要用户名)。在登录表单中,您可以输入用户名或电子邮件作为凭据。我还更改了配置文件设置,以更新用户名 我的实际问题是 在仅使用用户名注册的过程中,我得到空电子邮件字段的错误 登录期间,用户名将不是正确的凭据 我已经改变了一切类似的职位,但它不工作 1。更改config/fortify.php 'username' => 'email

我正在寻找一种解决方案,将标准Jetstream Auth更改为使用用户名或电子邮件进行身份验证。这意味着在注册帐户期间,您可以输入电子邮件或用户名(始终需要用户名)。在登录表单中,您可以输入用户名或电子邮件作为凭据。我还更改了配置文件设置,以更新用户名

我的实际问题是

  • 在仅使用用户名注册的过程中,我得到空电子邮件字段的错误

  • 登录期间,用户名将不是正确的凭据

  • 我已经改变了一切类似的职位,但它不工作

    1。更改
    config/fortify.php

    'username' => 'email' to 'username' => 'identity'
    
    2.在
    app/Providers/FortifyServiceProvider.php
    内部启动方法中添加了身份验证代码

    Fortify::authenticateUsing(function (LoginRequest $request) {
            $user = User::where('email', $request->identity)
                ->orWhere('username', $request->identity)->first();
    
            if (
                $user &&
                \Hash::check($request->password, $user->password)
            ) {
                return $user;
            }
        });
    
    并且还增加了类

    use Laravel\Fortify\Http\Requests\LoginRequest;
    use App\Models\User;
    
    3。在注册过程中添加用户名 添加输入字段unter
    register.blade.php

    <div class="mt-4">
                <x-jet-label for="username" value="{{ __('User Name') }}" />
                <x-jet-input id="username" class="block mt-1 w-full" type="text" name="username" :value="old('username')" required autofocus autocomplete="username" />
    </div> 
    
    Validator::make($input, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['string', 'email', 'max:255', 'unique:users'],
            'username' => ['required', 'string', 'max:255', 'unique:users'],
            'password' => $this->passwordRules(),
        ])->validate();
    
        return User::create([
            'name' => $input['name'],
            'email' => $input['email'],
            'username' => $input['username'],
            'password' => Hash::make($input['password']),
        ]);
    
    app/Actions/Fortify/CreateNewUser.php中的更改

    <div class="mt-4">
                <x-jet-label for="username" value="{{ __('User Name') }}" />
                <x-jet-input id="username" class="block mt-1 w-full" type="text" name="username" :value="old('username')" required autofocus autocomplete="username" />
    </div> 
    
    Validator::make($input, [
            'name' => ['required', 'string', 'max:255'],
            'email' => ['string', 'email', 'max:255', 'unique:users'],
            'username' => ['required', 'string', 'max:255', 'unique:users'],
            'password' => $this->passwordRules(),
        ])->validate();
    
        return User::create([
            'name' => $input['name'],
            'email' => $input['email'],
            'username' => $input['username'],
            'password' => Hash::make($input['password']),
        ]);
    
    5。将用户名字段添加到数据库中

    Schema::table('users', function (Blueprint $table) {
            $table->string('username')->nullable();
        });
    

    在第一种情况下,如果用户名是必需的,但电子邮件是可选的,则需要将
    nullable
    添加到验证属性中。请检查一下上面的文件

    对于第二个用例,
    login.blade.php
    默认的输入标记是
    name=“email”
    。那意味着你的情况会很糟糕
    $user=user::where('email',$request->email)->或where('username',$request->email)->first()


    查看Laravel Fortify。

    有人知道如何解决这个问题吗?