如果我将路由置于auth中间件组下,则不会出现警报

时间:2016-09-29 04:19:39

标签: ajax laravel

如果没有登录,我不允许用户提交表单。因此,请提醒登录。

Jquery和Ajax

 $(document).on('submit', '.bet', function (e) 
    {
        e.preventDefault();
        var frm = $(this);
        $.ajax({
                type: frm.attr('method'),
                url: frm.attr('action'),
                data: frm.serialize(),
                dataType: 'json',
                success: function (data)
                {
                    if(data == 'notloggedin')
                    {
                            alert('You must login first!');
                    }
                    else if(data==true)
                    {
                            swal('Bet Success! The details has been sent to your email!');
                    }
                    else if(data=='dateexpired')
                    {
                          swal('The match bet time expired!');
                    }
                 }
         });       
    });  

控制器:

public function store(Request $request)
{
    if($request->ajax())
    {
        if(!Auth::check())
        {
                echo json_encode('notloggedin');die;
        }
    ....

这一切都很好。但是,如果我将此路由置于auth中间件之下,则警报不会出现。在开发人员的工具中,我看到unauthorized action。是。很明显,但我仍然想要出现警报。

Route::group(['middleware' => ['auth']], function () {
          Route::post('/bet/store','BetController@store');
    });

2 个答案:

答案 0 :(得分:1)

这是因为从中间件返回请求(401)并且从不执​​行控制器操作。中间件也是这个检查的正确位置为什么你不从auth中间件返回未经授权的响应?像这样的东西

应用\ HTTP \中间件\验证

public function handle($request, Closure $next)
{
    if ($this->auth->guest()) {
        if ($request->ajax()) {
            return response()->json(['notloggedin']);
        }

        return redirect()->guest('login')->withErrors(['You must login first.']);
    }

    return $next($request);
}

请注意,这将返回ajax请求的状态200,但我发现您正在使用success功能,因此它可以正常工作。您还可以使用

返回401
if ($request->ajax()) {
      return response('Unauthorized.', 401);
}

并在jQuery上使用error方法

答案 1 :(得分:1)

错误未显示,因为如果auth中间件失败,则响应表明请求未成功(因此不会执行成功方法)。在这种情况下,您必须使用.fail()方法。

    var jqXHR = $.ajax({
            type: frm.attr('method'),
            url: frm.attr('action'),
            data: frm.serialize(),
            dataType: 'json',
            success: function (data)
            {
                if(data == 'notloggedin')
                {
                        alert('You must login first!');
                }
                else if(data==true)
                {
                        swal('Bet Success! The details has been sent to your email!');
                }
                else if(data=='dateexpired')
                {
                      swal('The match bet time expired!');
                }
             }
     }); 

jqXHR.fail(function( jqXHR, textStatus, errorThrown ) {
   if(jqXHR.status == 401) {
     alert('unauthorized');
   } 
});