Laravel 的表单验证 , 如何做到验证并改变 ( 转换 ) 数据 ?

发布于 2022-09-06 22:40:30 字数 455 浏览 19 评论 0

$validator = Validator::make($request->all(), [
            // 如何在这里转换数据
            'id' => 'required|integer'
            'title' => 'required|unique:posts|max:255',
            'body' => 'required',
        ]);

需求是这样的,比如 , id 传来的是 5,虽然可以通过 Laravel 的 integer 验证 , 但是它其实是一个 string 类型 ,导致我后面如果不强转换为 int , 程序就会出错 。虽然我可以在后面自己强转化 , 但觉得这样写不好, 我想在验证的同时就转换数据 。
所以有什么办法可以做到 在验证的同时并且转换数据 吗 ?谢谢大家了 。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱你是孤单的心事 2022-09-13 22:40:30

我已用其他方法解决 。找了很久,想了很久,貌似不能直接在验证里面做转化,但是我想到了一个更好的解决办法,解决方法如下 :

Laravel 有中间件,我们通常在中间件中做一些过滤 HTTP 请求的操作,但是还能做很多“请求预处理”操作,如 Laravel 内置的 TrimStrings 中间件 和 ConvertEmptyStringsToNull 中间件 ,这两个中间件都会把请求来的参数做些预处理操作,具体的使用请看源码 。

所以 , 我的解决方法就是创建一个 ConvertNumericStringsToInt 中间件 :

class ConvertNumericStringsToInt extends TransformsRequest
{
    /**
     * The attributes that should not be trimmed.
     *
     * @var array
     */
    protected $except = [
        //
    ];

    /**
     * Transform the given value.
     *
     * @param  string $key
     * @param  mixed $value
     * @return mixed
     */
    protected function transform($key, $value)
    {

        $transform = false;
        if ($key === 'id') {

            // 参数为 id
            $transform = true;
        } else if (1 === preg_match('/^[a-zA-Z][0-9a-zA-Z]*_id$/', $key)) {

            // 参数为 *_id
            $transform = true;
        } else if (1 === preg_match('/^[a-zA-Z][0-9a-zA-Z]*Id$/', $key)) {

            // 参数为 *Id
            $transform = true;
        }

        if ($transform) {

            if (!is_numeric($value)) {

                // 做你自己想做的处理( 如抛出异常 )
            }

            return is_numeric($value) ? intval($value) : $value;
        }

        // 返回原值
        return $value;
    }
}

这样,只要我们的传来的参数是 id , 或者 _id( user_id ),或者 Id( 如userId ),这个中间件都能检测,一旦发现不是数字 , 就会被处理( 如抛出异常 ),如果是数字的话,会被强转为int类型,我们之后的程序中就不用做任何处理了。

根据自己的使用情况决定是否将此中间件应用都全局中 。

小巷里的女流氓 2022-09-13 22:40:30

有办法,在Laravel 5.6中,有一个验证结束的钩子函数(after),当验证完成后会自动调用这个钩子函数:

$validator = Validator::make(...);

$validator->after(function ($validator) {
    if ($this->somethingElseIsInvalid()) {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
});

if ($validator->fails()) {
    //
}

官方文档链接:https://laravel.com/docs/5.6/...

还有一个方法(暂时想到的,没具体试过),你可以在id的验证规则中加一个numeric的验证规则:

...
'id' => 'required|integer|numeric',
...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文