如何覆盖验证规则登录 Laravel\Fortify?

Ale*_*tet 5 php laravel laravel-8

这在类 Laravel\Fortify\Http\Requests\LoginRequest 中描述
我想再添加一个验证行

namespace Laravel\Fortify\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Laravel\Fortify\Fortify;

class LoginRequest extends FormRequest
{
/..
    public function rules()
        {
            return [
                Fortify::username() => 'required|string',
                'password' => 'required|string',
            ];
        }
}
Run Code Online (Sandbox Code Playgroud)

但是我无法在供应商中进行自定义。
我的问题是如何做到这一点?

Ben*_*ett 10

以下是您在使用 Fortify 进行身份验证时如何使用自己的验证规则:

  1. LoginRequest.php在 App\Http\Requests 中创建一个扩展 FortifyLoginRequest.php类的文件

我只需复制该类并更新名称空间:

namespace App\Http\Requests;

use Laravel\Fortify\Http\Requests\LoginRequest as FortifyLoginRequest;
use Laravel\Fortify\Fortify;

class LoginRequest extends FortifyLoginRequest
{
    public function authorize()
    {
        return true;
    }

    public function rules()
    {
        return [
            Fortify::username() => 'required|string',
            'password' => 'required|string',
            'myAttribute' => 'rules' // Customizations... 
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. 在引导方法中添加绑定,AppServiceProviders.php以使用您自己的类解析 Fortify 的类:
public function boot()
{
    $this->app->bind('Laravel\Fortify\Http\Requests\LoginRequest', \App\Http\Requests\LoginRequest::class);
}
Run Code Online (Sandbox Code Playgroud)


小智 9

只是为了补充上面的评论,如前所述在供应商文件夹中进行更改是一个坏主意。一方面,任何推送到存储库的代码都不会反映这些更改(除非您修改了忽略文件)。

对于 Laravel/Fortify 添加新字段和更改默认验证规则,甚至密码要求也非常简单。我不清楚您的要求是什么,但简单地使用验证器可能更容易。这也是 Fortify 所使用的。例如,Fortify 发布两个文件:

App\Actions\Fortify\CreateNewUser.php
App\Actions\Fortify\PasswordValidationRules.php
Run Code Online (Sandbox Code Playgroud)

要为字段添加新的验证规则,只需将它添加到 Fortify 本身正在使用的 Validator::make 方法下的 CreateNewUser.php。您可以在自定义实现中遵循相同的逻辑。比如添加一个firstname字段,修改如下:

Validator::make($input, [
            'firstname' => ['required', 'string', 'max:255'],
        ])->validate();

        return User::create([
            'firstname' => $input['firstname'],
        ]);
Run Code Online (Sandbox Code Playgroud)

您可以根据需要添加任意数量的字段。要更改密码要求,请对 PasswordValidationRules.php 文件中的 passwordRules() 函数进行如下更改:

protected function passwordRules()
        {
        return ['required', 
        'string', 
        (new Password)->requireUppercase()
        ->length(10)
        ->requireNumeric()
        ->requireSpecialCharacter(), 
        'confirmed'];
    }
Run Code Online (Sandbox Code Playgroud)

所有这些信息都可以在官方文档https://jetstream.laravel.com/1.x/features/authentication.html#password-validation-rules 中找到


小智 -3

我找到了该页面:https://dev.to/aibnuhibban/login-customization-in-laravel-8-2gc8

转到供应商 > laravel > fortify > src > 规则 > Password.php

在那里你可以更改这些配置。

  • 您确实不应该在 Vendor 文件夹中进行更改。在供应商文件夹中所做的任何更改都将仅是本地的。如果由其他用户克隆,他们将不会收到您的更改。 (3认同)
  • 永远不要在供应商文件夹中编辑代码。每当您重新部署应用程序或更新包时,它都会被覆盖 (2认同)