Laravel 表单验证Rule::in中文时有bug

如下代码,始终返回true

    $validator =\Illuminate\Support\Facades\Validator::make(
        ['name' => '张三'],
        ['name' => \Illuminate\Validation\Rule::in(['张三', '李四'])]
    );

    dd(app()->version(), $validator->fails());

目前用过两个Laravel版本6和8都有这个bug。有大佬知道怎么解决吗

运行结果

Laravel 表单验证Rule::in中文时有bug

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

如果你是在 Windows 下,那猜测跟你的 locale 设置有关,因为在 in 规则的内部使用了 str_getcsv 来解析参数,而 str_getcsv 这个方法会受到 locale 的设置在分割字符串的时候出现意外情况,而自 PHP 8 开始默认的 locale 发生了变化,就不会再有这个问题了。

file
github.com/laravel/framework/blob/...

Laravel

编写代码进行测试,结果不符合预期。

Laravel

你可以在代码前面使用 setlocale(LC_ALL, 'C'); 修改 locale 信息后,再执行看看。

详见:Windows 下 PHP 7 中 *getcsv 函数解析 CSV 错误的问题记录

8个月前 评论
讨论数量: 6

我用laravel8测试你这个返回false

Laravel

Laravel

8个月前 评论
清风 (楼主) 8个月前
清风 (楼主) 8个月前
随波逐流

应该是你环境的影响的,我本地也是8.x,结果是正常的。

8个月前 评论

如果你是在 Windows 下,那猜测跟你的 locale 设置有关,因为在 in 规则的内部使用了 str_getcsv 来解析参数,而 str_getcsv 这个方法会受到 locale 的设置在分割字符串的时候出现意外情况,而自 PHP 8 开始默认的 locale 发生了变化,就不会再有这个问题了。

file
github.com/laravel/framework/blob/...

Laravel

编写代码进行测试,结果不符合预期。

Laravel

你可以在代码前面使用 setlocale(LC_ALL, 'C'); 修改 locale 信息后,再执行看看。

详见:Windows 下 PHP 7 中 *getcsv 函数解析 CSV 错误的问题记录

8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!