Laravel Dcat实现表单内选择不同的类型,显示相关必填的字段

效果

$this->radio('type', '选择类型')
     ->options([1 => '所有用户', 2 => '部分用户', 3 => '指定会员卡类型'])
     ->default(1)
     ->required()
     ->when(2, function (Form $form) {
         $form->file('member_file', '会员手机号文档')
              ->accept('xls,xlsx,csv')
              ->rules('mimes:xls,xlsx,csv');
      })
      ->when(3, function (Form $form) {
           $form->select('vip_type', '会员卡类型')
                ->options(WatchVipLevel::query()
                ->pluck('name', 'level')
                ->all());
      });

when中无法增加required验证,换一种方式实现

protected function validateInput(array $input): \Illuminate\Contracts\Validation\Validator
    {
        $rules = [
            'type' => 'required|integer|in:1,2,3',
        ];

        switch ($input['type']) {
            case 2:
                $rules['member_file'] = 'required|file|mimes:xls,xlsx,csv';
                break;
            case 3:
                $rules['vip_type'] = 'required|integer|exists:public-watch.watch_vip_level_config,level';
                break;
        }

        $messages = [
            'member_file.required' => '请上传文件',
            'vip_type.required' => '请选择会员卡',
        ];

        return Validator::make($input, $rules, $messages);
    }

$validator = $this->validateInput($input);

if ($validator->fails()) {
    return $this->response()->error($validator->errors()->first());
}

大佬指点后的做法

$this->radio('type', '选择类型')
     ->options([1 => '所有用户', 2 => '部分用户', 3 => '指定会员卡类型'])
     ->default(1)
     ->required()
     ->when(2, function (Form $form) {
          $form->file('member_file', '会员手机号文档')
               ->accept('xls,xlsx,csv')
               ->rules('required_if:type,2|mimes:xls,xlsx,csv', ['required_if' => '请上传导入文件', 'mimes' => '文件格式错误'])
               ->setLabelClass(['asterisk']);
      })
      ->when(3, function (Form $form) {
            $form->select('vip_type', '会员卡类型')
                 ->options(WatchVipLevel::query()->pluck('name', 'level')->all())
                 ->rules('required_if:type,3', ['required_if' => '请选择会员卡'])
                 ->setLabelClass(['asterisk']);;
     });
本作品采用《CC 协议》,转载必须注明作者和本文链接
DaiChongWeb
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1
DogLoML
$form->radio('type')
    ->when([1, 4], function (Form $form) {
        $form->text('text1')
            ->rules('required_if:type,1,4') // 使用required_if
            ->setLabelClass(['asterisk']); // 显示 * 号
    });
1周前 评论

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