laravel 5.5 集成 mews/captcha 需严格按序执行:先 composer require mews/captcha,再手动注册服务提供者和门面,运行 php artisan vendor:publish 生成配置,启用 gd 和 fileinfo 扩展,前端用 captcha_src() + math.random() 防缓存,验证字段名必须为 captcha,规则写 required|captcha,错误提示需手动配置中文语言包。

直接用 mews/captcha,Laravel 5.5 兼容性好、配置轻、上手快,但必须注意 PHP 扩展和配置顺序,否则会报 Class 'Mews\Captcha\CaptchaServiceProvider' not found 或图片 404。
安装与基础配置必须按顺序执行
错一步就卡住,尤其 Laravel 5.5 默认不自动发现包,composer require mews/captcha 后不能跳过手动注册。
- 先执行
composer require mews/captcha(不要加版本号,默认拉取 ~2.0,兼容 PHP 7.1+ 和 Laravel 5.5) - 编辑
config/app.php:在'providers'数组末尾加Mews\Captcha\CaptchaServiceProvider::class - 同样在
config/app.php的'aliases'里加'Captcha' => Mews\Captcha\Facades\Captcha::class - 再运行
php artisan vendor:publish,选Mews\Captcha\Providers\CaptchaServiceProvider对应的序号生成config/captcha.php - Windows 环境务必确认
php_gd2.dll和php_fileinfo.dll在php.ini中已启用(取消注释),否则captcha_src()返回空或 500
前端嵌入要带点击刷新 + 错误反馈闭环
captcha_src() 生成的是动态路由,但默认没加防缓存,用户点不动、重复提交失败很常见。
- 模板中写:
<img src="%7B%7B%20captcha_src('default')%20%7D%7D" onclick="this.src='{{ captcha_src('default') }}?'+Math.random()" alt="验证码"> - 输入框
name必须为captcha,否则验证规则不触发(Laravel 验证器硬编码匹配该字段名) - 错误提示要包裹
@if ($errors->has('captcha'))<span>{{ $errors->first('captcha') }}</span>@endif,否则校验失败时 UI 没反馈 - 别用
captcha_img()—— 它是旧版函数,5.5+ 已弃用,会报Call to undefined function captcha_img()
后端验证规则写法有固定格式
不是所有写法都生效,captcha 规则依赖服务提供者注入的验证器扩展,字段名、规则字符串、中文提示三者必须对齐。
- 验证数组里写:
'captcha' => 'required|captcha'(注意不是captcha:default,也不支持自定义 driver 名) - 如果用
$this->validate(),第二个参数就是上述规则;若用Validator::make(),也必须传相同字段名和规则 - 中文提示需手动加:
['captcha.required' => '验证码不能为空', 'captcha.captcha' => '验证码不正确'],因为mews/captcha没内置语言包 - 别在控制器里调
Captcha::check($request->captcha)—— 这个方法只返回 bool,不抛异常、不写 session,无法联动 Laravel 错误收集机制
样式定制和多主题切换靠 config/captcha.php
改完配置不生效?多半是没清配置缓存或没选对主题名。
- 修改
config/captcha.php里的'default'或新增如'flat'数组,调整length、width、height、lines等参数 - 前端调用时传主题名:
captcha_src('flat'),对应配置里键名,大小写敏感 - 改完配置必须运行
php artisan config:clear,否则缓存旧值,图片尺寸/字符数不变 - 字体文件缺失会导致空白图:Linux 下确保
resources/fonts存在并有可读权限;Windows 可复制一份arial.ttf放进去,或在配置里指定'font' => base_path('resources/fonts/arial.ttf')
最常被跳过的点:GD 扩展没开、config 缓存没清、字段名没叫 captcha、错误提示没手动配——这四条占了 80% 的集成失败案例。











