## 验证码 MixPHP 的验证码类并没有像其他框架一样设计成非常耦合的方式,使用户无法了解验证码实现原理,而是让验证码回归原始,只做验证码生成, 其他交互功能由框架组件来完成。 | 类 | 调用 | | --- | --- | | mix\http\Captcha | new Captcha([配置]); | ## 控制器 (输出) 在控制器的方法中输出验证码图片,微调 `angleRand`、`xSpacing`、`yRand` 三个参数可调整文字的相对位置,验证码中的文字越是粘连越难以破解。 ### 英文验证码 >[danger] `TimesNewRomanBold.TTF` 英文字体文件框架内不包含,需用户自行下载。 ~~~ public function actionIndex() { Response::setHeader('Content-Type', 'image/png'); $captcha = new Captcha([ 'width' => 100, 'height' => 40, 'fontFile' => app()->basePath . '/fonts/TimesNewRomanBold.TTF', 'fontSize' => 20, 'wordNumber' => 4, 'angleRand' => [-20, 20], 'xSpacing' => 0.82, 'yRand' => [5, 15], ]); $captcha->generate(); Session::set('captchaText', $captcha->getText()); return $captcha->getContent(); } ~~~ ### 中文验证码 >[danger] `SIMLI.TTF` 中文字体文件框架内不包含,需用户自行下载。 ~~~ public function actionIndex() { Response::setHeader('Content-Type', 'image/png'); $captcha = new Captcha([ 'width' => 100, 'height' => 40, 'fontFile' => app()->basePath . '/fonts/SIMLI.TTF', 'fontSize' => 22, 'wordSet' => '酸旧却充秋遍锻玉夏疗尖殖井费州访吹荣铜沿替滚客召旱悟刺脑措贯藏敢令隙炉壳硫煤迎铸粘探临薄旬善福纵择礼愿伏残雷延烟句纯渐耕跑泽慢栽鲁赤繁境潮横掉锥希池败船假亮谓托伙哲怀割摆贡呈劲财仪沉炼麻罪祖息车穿货销齐鼠抽画饲龙库守筑房歌寒喜哥洗蚀废纳腹乎录镜妇恶脂庄擦险赞钟摇典柄辩竹谷卖乱虚桥奥伯赶垂途额壁网截野遗静谋弄挂课镇妄盛耐援扎虑键归符庆聚绕摩忙舞遇索顾胶羊湖钉仁音迹碎伸灯避泛亡答勇频皇柳哈揭甘诺概宪浓岛袭谁洪谢炮浇斑讯懂灵蛋闭孩释乳巨徒私银伊景坦累匀霉杜乐勒隔弯绩招绍胡呼痛峰零柴簧午跳居尚丁秦稍追梁折耗碱殊岗挖氏刃凸役剪川雪链渔啦脸户洛孢勃盟买杨宗焦赛旗滤硅缸夹念兰映沟乙吗儒杀汽磷艰晶插埃燃欢铁补咱芽永瓦倾阵碳演威附牙芽永瓦斜灌欧献顺猪洋腐请透司危括脉宜笑若尾束壮暴企菜穗楚汉愈绿拖牛份染稳夺硬价努翻奇甲预职评读泥辟告卵箱掌氧恩爱停曾溶营终纲孟钱待尽俄缩沙退陈讨炭股坐蒸凝竟陷枪黎救冒暗洞犯筒您宋淡允叛畜俘摸锈扫毕璃宝芯爷鉴秘净蒋钙肩腾枯抛轨堂拌爸循诱祝励肯酒绳穷塘燥泡袋朗喂铝软渠颗惯贸粪综墙趋彼届墨碍启逆卸航衣孙龄岭骗休借们以我到他会作时要动国产的一是工就年阶义发成部民可出能方进在了不和有饿', 'wordNumber' => 3, 'angleRand' => [-20, 20], 'xSpacing' => 0.85, 'yRand' => [5, 10], ]); $captcha->generate(); Session::set('captchaText', $captcha->getText()); return $captcha->getContent(); } ~~~ ## 视图 (引用) 在视图中使用 `img` 标签,在 `src` 属性中指向验证码控制器方法的 URL 地址。 ~~~ <img src="/captcha" height=38> ~~~ ## 验证器 (验证) 用户提交验证码后需要在验证器中验证,使用验证规则 `call` 来自定义验证。 1. 首先定义规则、场景、消息。 ~~~ // 规则 public function rules() { return [ 'captcha' => ['call', 'callback' => [$this, 'captchaCheck']], ]; } // 场景 public function scenarios() { return [ 'index' => ['required' => ['captcha']], ]; } // 消息 public function messages() { return [ 'captcha' => '验证码不正确.', ]; } ~~~ 2. 增加 `captchaCheck` 方法 ~~~ public function captchaCheck($attributeValue) { $captchaText = Session::get('captchaText'); if (strcasecmp($attributeValue, $captchaText) == 0) { return true; } return false; } ~~~