本文由 简悦 SimpRead 转码, 原文地址 www.jianshu.com

Laravel的验证码库gregwar_captcha - 简书 - 图1

0.3272015.05.28 23:35:47 字数 489 阅读 34,943

原创作品,允许转载,转载时请务必以超链接形式标明原始出处、作者信息和本声明,否则后果自负。 如果你觉得这篇文章对你有帮助或启发,可直接留言和我沟通 **

Laravel的验证码库gregwar_captcha - 简书 - 图2

案例展示

在 Laravel 中有很多图片验证码的库可以使用,本篇介绍其中之一:gregwar/captcha,这个库比较简单,在 Laravel 中比较常用。下面我们就来介绍下使用细节:


首先, composer.json 中如下加入配置:

  1. "require": {
  2. ...
  3. "gregwar/captcha": "1.*"
  4. },

然后,已成习惯的命令:

composer update

接下来就可以正常使用了,根据具体的开发需求,可以有很多种方式去使用。

  • 可以将验证码图片保存文件:
<?php

$builder->save('out.jpg');
  • 可以直接输出图片到网页:
<?php

header('Content-type: image/jpeg');
$builder->output();
  • 可以生成内联图片:
<img src="<?php echo $builder->inline(); ?>" />

以下演示了其中一种使用方式,直接输出图片到网页。

我定义了一个 Controller:

<?php namespace App\Http\Controllers;

use App\Http\Requests;
use App\Http\Controllers\Controller;

use Illuminate\Http\Request;


use Gregwar\Captcha\CaptchaBuilder;
use Session;

class KitController extends Controller {


    public function captcha($tmp)
    {

        $builder = new CaptchaBuilder;

        $builder->build($width = 100, $height = 40, $font = null);

        $phrase = $builder->getPhrase();


        Session::flash('milkcaptcha', $phrase);

        header("Cache-Control: no-cache, must-revalidate");
        header('Content-Type: image/jpeg');
        $builder->output();
    }

}

下面我们可以设置相应的 router 访问这个验证码图片, 修改 router.php:

Route::get('kit/captcha/{tmp}', 'KitController@captcha');

现在可以通过具体的 url,可以访问看到这张图片了

Laravel的验证码库gregwar_captcha - 简书 - 图3

验证码

表单内部写的比较简单,看看即可:

<input type="text" >
          <a onclick="javascript:re_captcha();" ><img src="{{ URL('kit/captcha/1') }}"  alt="验证码" title="刷新图片" width="100" height="40" border="0"></a>

<script>  
  function re_captcha() {
    $url = "{{ URL('kit/captcha') }}";
        $url = $url + "/" + Math.random();
        document.getElementById('c2c98f0de5a04167a9e427d883690ff6').src=$url;
  }
</script>

最后就是在 form 提交页面验证相应验证码,库中也为我们提供了相应方法:

$userInput = $request->get('captcha');

if($builder->testPhrase($userInput)) {

    return '您输入验证码正确';
} else {

    return '您输入验证码错误';
}

至此,验证码就完成了。 如有疑问,欢迎回复探讨。

补充

在 form 表单提交验证的代码写的比较草率,给读者带来了歧义,在此有个补充(感谢 一块黄布 的回复):
$builder->testPhrase($userInput) 这里的 $builder 与生成验证码的 $builder 为同一个,如果重新 new,则一直会验证失败。我们可以从源码中看到:

public function testPhrase($phrase)

 {

 return ($this->builder->niceize($phrase) == $this->builder->niceize($this->getPhrase()));

 }

验证码正确性判断,也可以由下列方式来验证:

$userInput = \Request::get('captcha');

if (Session::get('milkcaptcha') == $userInput) {

    return '您输入验证码正确';
} else {

    return '您输入验证码错误';
}