You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Livewire集成biscolab/laravel-recaptcha时验证属性缺失错误求助

问题解决:Livewire + biscolab/laravel-recaptcha 验证报错处理

错误原因

Livewire 的 validate() 方法仅会验证组件类中声明的公共属性。你在 $rules 里添加了 g-recaptcha-response 规则,但组件中没有对应的公共属性,因此触发 No property found for validation: [g-recaptcha-response] 错误。


解决方案(两种可选)

方法一:手动验证 reCAPTCHA 字段(无需修改组件属性)

修改组件的 save() 方法,先验证表单属性,再单独验证 reCAPTCHA 响应:

use Illuminate\Support\Facades\Validator;

class ContactForm extends Component
{
    public $name;
    public $email;
    public $phone;
    public $message;
    
    protected $rules = [
        'name' => 'required',
        'email' => 'required|email',
        'phone' => 'required',
        'message' => 'required',
    ];

    public function render()
    {
        return view('livewire.contact-form');
    }

    public function save(){
        // 先验证表单基础字段
        $this->validate();

        // 单独获取并验证 reCAPTCHA 响应
        $recaptchaData = [
            'g-recaptcha-response' => request()->input('g-recaptcha-response')
        ];
        $recaptchaRules = ['g-recaptcha-response' => 'recaptcha'];
        
        $validator = Validator::make($recaptchaData, $recaptchaRules);
        if ($validator->fails()) {
            $this->addError('recaptcha', $validator->messages()->first());
            return;
        }

        // 保存数据
        Contact::create([
            'name' => $this->name,
            'email' => $this->email,
            'phone' => $this->phone,
            'message' => $this->message,
        ]);
        session()->flash('status', 'Thanks!');
    }
}

然后在视图中添加 reCAPTCHA 的错误提示:

{!! htmlFormSnippet() !!}
@error('recaptcha') <span class="text-danger">{{ $message }}</span> @enderror

方法二:添加组件属性并绑定(更符合 Livewire 风格)

  1. 组件类中添加公共属性(用驼峰命名,Livewire 会自动映射 HTML 中的短横线命名):
class ContactForm extends Component
{
    public $name;
    public $email;
    public $phone;
    public $message;
    public $gRecaptchaResponse; // 对应 HTML 的 g-recaptcha-response
    
    protected $rules = [
        'name' => 'required',
        'email' => 'required|email',
        'phone' => 'required',
        'message' => 'required',
        'gRecaptchaResponse' => 'recaptcha', // 验证规则对应驼峰属性
    ];

    // ... 其他方法保持不变
}
  1. 修改视图中的 reCAPTCHA 渲染代码,添加 wire:model 绑定:
    替换原有的 {!! htmlFormSnippet() !!} 为手动渲染的代码,确保绑定到组件属性:
<div class="g-recaptcha" 
     data-sitekey="{{ config('recaptcha.site_key') }}" 
     wire:model="gRecaptchaResponse"></div>
@error('gRecaptchaResponse') <span class="text-danger">{{ $message }}</span> @enderror

额外注意事项

  • 确保 biscolab/laravel-recaptcha 已正确配置:在 .env 文件中填写 RECAPTCHA_SITE_KEY 和 RECAPTCHA_SECRET_KEY
  • 若使用方法二,reCAPTCHA 验证成功后,Livewire 会自动同步响应值到组件属性,无需手动处理

内容的提问来源于stack exchange,提问作者mahla sg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:32:29