Gregwar/captcha 是一个使用比较广泛的 PHP 验证码包,在最近一次用 composer update 进行更新后,却发现其生成的验证码图片不显示验证码了。

captcha.jpg

CaptchaBuilder 类的构造函数:


public function __construct($phrase = null, PhraseBuilderInterface $builder = null)
{
    if ($builder === null) {
        $this->builder = new PhraseBuilder;
    } else {
        $this->builder = $builder;
    }
    
    $this->phrase = is_string($phrase) ? $phrase : $this->builder->build($phrase);
}

原先的调用代码:

$code = mt_rand(1000, 9999);
$builder = new CaptchaBuilder($code);
$builder->build(160, 40);
$image = 'data:image/jpeg;base64,'.base64_encode($builder->get());

对照两段代码,发现问题在于最新版的 gregwar/captcha 其 CaptchaBuilder 类的构造函数对于参数 $phrase,若其是字符串,则认为是验证码,否则会当做验证码长度传给 PhraseBuilder 类的 build 方法,因此在调用代码中将生成的随机数转换为字符串即可:

$code = strval(mt_rand(1000, 9999));