【问题标题】:Globally defining rules for common request fields通用请求字段的全局定义规则
【发布时间】:2019-06-21 16:28:54
【问题描述】:

在我的 Laravel 5.7 应用程序中,我有几个收集常用信息的请求 - 姓名、电子邮件、电话等。

是否有一种有效的方法可以在应用程序级别为这些通用或“全局”字段定义验证规则,以便更好地管理它们?

目前,更新验证意味着触及每个请求。

没有为每个字段创建规则并在每个请求的开头导入它们,我没有看到一种优雅的方式来实现这一点。

【问题讨论】:

    标签: laravel validation


    【解决方案1】:

    也许您可以使用中间件来实现:https://laravel.com/docs/5.7/middleware

    我没有例子,但我认为做这样的事情可以工作:

    首先创建一个中间件:

    php artisan make:middleware CheckCommonFields
    

    然后验证您的请求是否包含“常见请求字段”

    public function handle($request, Closure $next)
    {
        if ($request->input('email')) {
            $validator = Validator::make($request->all(), [
                'email' => 'required|email',
            ]);
            if ($validator->fails()) {
                return redirect('somewhere')
                        ->withErrors($validator)
                        ->withInput();
            }
        } 
    
        return $next($request);
    }
    

    将中间件添加到您的 Kernel.php $routeMiddleware

    protected $routeMiddleware = [
            ...
            'commonFields' => \App\Http\Middleware\CheckCommonFields::class,
        ];
    

    最后,在web.php(或api.php或whatever.php)中添加这些验证规则所涉及的路由的中间件:

    Route::post(/whatever/you/want, 'WhateverController@action')->name('whatever')->middleware('commonFields');
    

    【讨论】:

    • 非常感谢。我将在 dev 中检查它并跟进/将其标记为已回答。谢谢。
    • Louis 是否有任何理由为每个请求字段检查复制验证器失败逻辑?违反 DRY 让我的皮肤爬行。
    • 我只是给了你一种方法,你可以在中间件中做任何你想做的事情
    • 谢谢,不胜感激
    【解决方案2】:

    您好,我希望这是您正在寻找的,如果不是,请道歉。

    对于常见的验证,我创建了一个请求表单 - Laravel docs - HTTP requests

    如果您使用 php artisan make:request ExampleFormRequestthis 之类的内容,则会在 Http 文件夹中创建相关文件夹“Requests”。

    在您的文件 ExampleFormRequest 中,您可以指定规则,而不是在控制器中多次验证同一事物

    例如

        'name' => 'required|unique:posts|max:255',
        'email' => 'required|email|unique:users',
        'address' => 'required|string|max:500'
    

    等等,你可以像这样在方法参数中调用请求表单:

    public function store(ExampleFormRequest $request)
    {
        ...
    }
    

    我希望这会有所帮助:)

    【讨论】:

    • 这是常用的方式。我认为他不想为每个请求都这样做
    • 正确,我已经在对我所有的请求使用请求,但是它们都包含我想抽象出来的公共字段,以便更轻松地管理或添加它们。
    • 我同意,这是常见的方式 - 但是将其与您自己的配置或定义的常量结合起来怎么样?毕竟,我们在这里基本上是在处理字符串。或者,也许您希望某种......全局请求验证器?
    • @ironchefbadas 使用中间件有什么问题?
    • @louis 如果有您愿意分享的示例,我不反对探索它。我不知道可以以这种方式使用中间件。总是乐于学习新事物
    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 1970-01-01
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 2015-05-28
    • 2020-05-12
    相关资源
    最近更新 更多