laravel或hyperf怎样写局部自定义验证方法?目前看到文档都是全局注册一个自定义规则类 然后在里面写自定义验证函数?

1. 运行环境#

docker

1). 当前使用的 Laravel 版本?#

laravel8 或 hyperf3

2). 当前使用的 php/php-fpm 版本?#

PHP 版本:8.1

php-fpm 版本:8.1

3). 当前系统#

macos
//: <> (期待数值 Windows 10 / Ubuntu 20.4 / CentOS 8)

4). 业务环境#

hyperf 的 mineAdmin 框架
//: <> (期待信息 开发环境生产环境)
//: <> (是否使用负载均衡?请提供相关信息)

5). 相关软件版本#

2. 问题描述?#

laravel或hyperf怎样写局部自定义验证方法?目前看到文档都是全局注册一个自定义规则类 然后在里面写自定义验证函数?
我查到的 hyperf 自定义验证规则文档:https://www.hyperf.wiki/3.0/#/zh-cn/validation?id=%e8%87%aa%e5%ae%9a%e4%b9%89%e9%aa%8c%e8%af%81%e8%a7%84%e5%88%99
但是这样注册的方法是全局可用的,我不想这样。比如我只想当前类独有这个自定义验证规则方法?
hyperf 和 laravel 的解决方案都可以。不知道的各位遇到这种需要自定义验证规则的时候 都是定义到全局吗?
我问过 ChatGPT 没有给我很好的解决方案。比如拿到验证数据后 再次手动操作验证类去自定义规则。这不是一个好的解决方案。
第一次提问 如果描述的不清楚希望包含指出。我将持续改进 谢谢

3. 您期望得到的结果?#

可以定义属于某个验证器类的 自定义验证方法
//: <> (能截图就截图。)

4. 您实际得到的结果?#

必须全局注册定义 自定义验证规则方法

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

如果你在使用较新的 Laravel 版本,可以试一下上面 @没有哆啦 A 梦的大雄 提到的 闭包规则,这个规则在 ValidationRuleParser::prepareRule 里面进行了处理。

你只需要把 rules 方法里面的闭包稍微改造一下,就可以在 ruleDemo 方法里面像闭包规则那样验证了。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TestFormRequest extends FormRequest
{

    public function rules(): array
    {
        return [
            'id' => [\Closure::fromCallable([$this, 'ruleDemo'])]
        ];
    }

    public function ruleDemo()
    {
        $args = func_get_args();
        dump($args);
    }
}

如果你使用 PHP 8.1+ ,rules 方法还可以这样写。

    public function rules(): array
    {
        return [
            'id' => [$this->ruleDemo(...)]
        ];
    }
1年前 评论
lait233 (楼主) 1年前
Rache1 (作者) 1年前
lait233 (楼主) 1年前
Rache1 (作者) 1年前
lait233 (楼主) 1年前
lait233 (楼主) 1年前
Rache1 (作者) 1年前
讨论数量: 13

主要之前用 TP 确实比较方便,直接在当前定义的验证类里面定义的方法就能直接放到验证器里面用。想问一下你们都没有这种需求吗?

1年前 评论
DogLoML

可以试试这样,在 Request 里面定义验证方法,然后创建一个 Rule,构造函数里面把 Requst 传进去,而 passes 内则根据 $attribute,去回调 request 中对应名称的 rule 方法,比如验证 phone,就走 phoneRule

Laravel

Laravel

namespace xxx;

use Illuminate\Contracts\Validation\Rule;

class CallbackRule implements Rule {
    public $request;

    public function __construct($request) {
        $this->request = $request;
    }

    public function passes($attribute, $value) {
        return $this->request->{$attribute.'Rule'}($attribute, $value);
    }

    public function message() {
        return ':attribute 格式不正确';
    }
}
1年前 评论

用闭包

public function rules(): array
{
    return [
        'id' => [
            'required',
            function($attribute,$value,$fail){
                if($value != 1){
                    $fail('自定义错误信息');
                }
            }
        ]
    ];
}
1年前 评论
lait233 (楼主) 1年前
神的孩子丶都在跳舞 (作者) 1年前

如果你在使用较新的 Laravel 版本,可以试一下上面 @没有哆啦 A 梦的大雄 提到的 闭包规则,这个规则在 ValidationRuleParser::prepareRule 里面进行了处理。

你只需要把 rules 方法里面的闭包稍微改造一下,就可以在 ruleDemo 方法里面像闭包规则那样验证了。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class TestFormRequest extends FormRequest
{

    public function rules(): array
    {
        return [
            'id' => [\Closure::fromCallable([$this, 'ruleDemo'])]
        ];
    }

    public function ruleDemo()
    {
        $args = func_get_args();
        dump($args);
    }
}

如果你使用 PHP 8.1+ ,rules 方法还可以这样写。

    public function rules(): array
    {
        return [
            'id' => [$this->ruleDemo(...)]
        ];
    }
1年前 评论
lait233 (楼主) 1年前
Rache1 (作者) 1年前
lait233 (楼主) 1年前
Rache1 (作者) 1年前
lait233 (楼主) 1年前
lait233 (楼主) 1年前
Rache1 (作者) 1年前