Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何覆盖登录Laravel\Fortify的验证规则?_Php_Laravel_Laravel 8 - Fatal编程技术网

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

Php 如何覆盖登录Laravel\Fortify的验证规则?,php,laravel,laravel-8,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()

这在类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',
            ];
        }
}
但我无法在供应商中进行定制。
我的问题是如何做到这一点?

我找到了该页面:

转到vendor>laravel>fortify>src>Rule>Password.php


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

简而言之,我这样解决了这个问题

将vendor\laravel\fortify\src\Http\Controllers\AuthenticatedSessionController.php复制到 app\Http\Controllers\Auth\LoginController.php(更改名称空间和类名)

将vendor\laravel\fortify\src\Http\Requests\LoginRequest.php复制到app\Http\Requests\LoginFormRequest.php(更改名称空间和类名)

在routes/web.php中添加新路由

use App\Http\Controllers\Auth\LoginController;
//
Route::post('/login', [LoginController::class, 'store'])
        ->middleware(array_filter([
            'guest',
            $limiter ? 'throttle:'.$limiter : null,
        ]));
在LoginController中将LoginRequest更改为LoginFormRequest,并

public function store(LoginFormRequest $request)
    {
        return $this->loginPipeline($request)->then(function ($request) {
            return app(LoginResponse::class);
        });
    }
在LoginFormRequest中添加我的新规则


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

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

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

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

        return User::create([
            'firstname' => $input['firstname'],
        ]);
protected function passwordRules()
        {
        return ['required', 
        'string', 
        (new Password)->requireUppercase()
        ->length(10)
        ->requireNumeric()
        ->requireSpecialCharacter(), 
        'confirmed'];
    }
您可以添加任意数量的字段。要更改密码要求,请对PasswordValidationRules.php文件中的passwordRules()函数进行如下更改:

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

        return User::create([
            'firstname' => $input['firstname'],
        ]);
protected function passwordRules()
        {
        return ['required', 
        'string', 
        (new Password)->requireUppercase()
        ->length(10)
        ->requireNumeric()
        ->requireSpecialCharacter(), 
        'confirmed'];
    }

所有这些信息都可以在官方文档中找到,但是Jetstream的文档提供了一个示例:

(新密码)->长度(10)


至少需要一个大写字符……
(新密码)->requireUppercase()

至少需要一个数字字符……
(新密码)->requireNumeric()


但我不清楚如何使用它们,将它们放在何处。我需要更改登录验证,添加新字段。一切都很清楚,你真的不应该在供应商文件夹中进行更改。在供应商文件夹中所做的任何更改将仅限于本地。如果被其他用户克隆,他们将不会收到您的更改。永远不要编辑供应商文件夹中的代码。无论何时重新部署应用程序或更新包,它都会被覆盖,因为某些原因,这对我不起作用。我试着输入3个字符的长度,然后取出确认书,但是没有用,继续用8个字符和confirmation@JanosAudran他给了你正确的答案。这是实现你打算做的事情的正确方法。正如Snapey和TheSk8rJesus所指出的,更改供应商文件夹是一种不好的做法。您可以通过更改供应商文件夹来完成工作,但至少可以说这是一种不好的做法。试试JanosAudran的建议。