表单验证之 in:foo,bar

文档链接

表单验证《Laravel 9 中文文档》

in:foo,bar,…

验证字段必须包含在给定的值列表中。由于此规则通常要求你 implode 数组,因此可以使用 Rule::in 方法来流畅地构造规则:

use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

Validator::make($data, [
    'zones' => [
        'required',
        Rule::in(['first-zone', 'second-zone']),
    ],
]);

问题来了

$data = $request->validate([
  'language' => 'in:zh,en',
  'type' => 'in:文字案例,微案例,视频案例',
]);

英文规则language能正常通过验证,中文规则type仅输入项为规则中第一项时可以通过,其他不能通过验证。

尝试一

尝试将language规则改为:'language' => 'in:中文,英文',后同上,输入项为中文时可以通过,英文不能通过验证。

尝试二

将验证规则改为Rule:in()

$data = $request->validate([
  'language' => Rule::in(['中文','英文']),
  'type' => Rule::in(['文字案例','微案例','视频案例']),
]);

结果问题依旧。

尝试三

尝试使用闭包:

$data = $request->validate([
  'type' =>  function ($attribute, $value, $fail) {
        if (!in_array($value, ['文字案例','微案例','视频案例'])) {
            $fail('案例类型选择错误');
        }
    },
]);

终于正常了!

求大神深究一下原因,感谢!

正在努力学习的小逗比 [ dobeen.net ]
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

您好,我之前也遇到过这个问题。

首先说结论,这不是 Laravel 框架的问题,这是 Windows 环境下 PHP 编码导致的。

具体请查看 Issue

我本地测试你的代码没有问题,不需要使用闭包。

我的环境是 MacOS, PHP8.1, Laravel9

建议你把这段代码扔到 Linux 环境试一下。

1年前 评论
Mutoulee (楼主) 1年前
讨论数量: 7

我用 laravel6 测试以上两种写法都正常

1年前 评论
Mutoulee (楼主) 1年前
php_yt (作者) 1年前
Mutoulee (楼主) 1年前

您好,我之前也遇到过这个问题。

首先说结论,这不是 Laravel 框架的问题,这是 Windows 环境下 PHP 编码导致的。

具体请查看 Issue

我本地测试你的代码没有问题,不需要使用闭包。

我的环境是 MacOS, PHP8.1, Laravel9

建议你把这段代码扔到 Linux 环境试一下。

1年前 评论
Mutoulee (楼主) 1年前

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