使用Securimage验证码与Laravel 5.3

Ton*_*oni 12 laravel-5.3

我为securimage验证码安装了一个laravel包,一切似乎都很好(如显示随机验证码),但即使在放入正确的文本后,它仍然表示无效.有谁可以帮助我吗.这是我的代码

Route::any('/test-captcha', function (){
    if (Request::getMethod() == 'POST')
    {
        $rules = ['captcha' => 'required|captcha'];

        $validator = Validator::make(Input::all(), $rules);
        if ($validator->fails())
        {
            echo '<p style="color: #ff0000;">Incorrect!</p>';
        }
        else
        {
            echo '<p style="color: #00ff30;">Matched :)</p>';
        }
    }

    $form = '<form method="post" action="test-captcha">';
    $form .= '<input type="hidden" name="_token" value="' . csrf_token() . '">';
    $form .= '<p>' . captcha_img() . '</p>';
    $form .= '<p><button type="submit" name="check">Check</button></p>';
    $form .= '</form>';
    return $form;
});
Run Code Online (Sandbox Code Playgroud)

sho*_*ild 1

简短的解决方案:将此行添加到您的routes.php 文件中:

Route::get('securimage', ['as' => 'securimage', 'uses' => '\Yhbyun\Securimage\SecurimageController@getCaptcha']);

Route::get('securimage/audio', ['as' => 'securimage.audio', 'uses' => '\Yhbyun\Securimage\SecurimageController@getAudio']);

Route::get('securimage/check', ['as' => 'securimage.check', 'uses' => '\Yhbyun\Securimage\SecurimageController@check']);
Run Code Online (Sandbox Code Playgroud)

在这里我会解释一下,为什么

这种情况下的问题是,该包在 /vendor/yhbyun/laravel-securimage/src/SecurimageServiceProvider.php中定义其路由 ,如下所示:

        $app['router']->get('securimage', ['as' => 'securimage', 'uses' => 'Yhbyun\Securimage\SecurimageController@getCaptcha']);

        $app['router']->get('securimage/audio', ['as' => 'securimage.audio', 'uses' => 'Yhbyun\Securimage\SecurimageController@getAudio']);

        $app['router']->get('securimage/check', ['as' => 'securimage.check', 'uses' => 'Yhbyun\Securimage\SecurimageController@check']);
Run Code Online (Sandbox Code Playgroud)

如果运行,php artisan route:list您可以看到没有应用中间件,因为在 Laravel 的 Kernel.php 文件中,只有在 paths.php 中定义的路由与应用的“web”中间件分组:

    Route::group([
        'middleware' => 'web',
        'namespace' => $this->namespace,
    ], function ($router) {
        require base_path('routes/web.php');
    });
Run Code Online (Sandbox Code Playgroud)

Web 中间件组包含用于启动会话的中间件:

    'web' => [
        // ....
        \Illuminate\Session\Middleware\StartSession::class,
        // .....
    ],
Run Code Online (Sandbox Code Playgroud)

也许有人想为已经使用“web”中间件的 Laravel 版本创建拉取请求。这可能类似于(在 SecurimageServiceProvider.php 中):

    $app['router']->group(['middleware' => 'web'], function() use ($app) {
        $app['router']->get('securimage', ['as' => 'securimage', 'uses' => 'Yhbyun\Securimage\SecurimageController@getCaptcha']);

        $app['router']->get('securimage/audio', ['as' => 'securimage.audio', 'uses' => 'Yhbyun\Securimage\SecurimageController@getAudio']);

        $app['router']->get('securimage/check', ['as' => 'securimage.check', 'uses' => 'Yhbyun\Securimage\SecurimageController@check']);
    });
Run Code Online (Sandbox Code Playgroud)