如何在Laravel中进行ajax调用后重定向到登录名?

问题描述 投票:1回答:1

我有一个对所有用户可见的“喜欢”按钮,但我只希望经过身份验证的用户能够喜欢该产品,并且与该产品不同。如果客人试图喜欢,我想将他们重定向到登录页面。

刀片文件

 <div style="display: {{$product->isLiked ? "" : "none"}}" id="deletefavourite{{$product->id}}"onClick="deleteFromFavourites({{$product->id}}, {{   Auth::user()->id }})"> unlike </div>
<div style=" display: {{!$product->isLiked ? "" : "none"}}" id="addfavourites{{$product->id}}" onClick="addToFavourites({{$product->id}}, {{ Auth::user()->id }})" > like </div>

Javascript

  function addToFavourites(productid, userid) {
$.ajaxSetup({
headers: {
    'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});

$.ajax({
method: 'post',
url: `/product/like/${productid}`,
data: {
    'user_id': userid,
    'product_id': productid,
},
success: function () {
    // hide add button
console.log($('#addfavourites' + productid));
    $('#addfavourites' + productid).show();
    // show delete button
    $('#deletefavourite' + productid).show();
},
error: function (XMLHttpRequest) {
    // handle error
}
});

}

类似控制器

  public function likeProduct($id)
{


    if(Auth::check()){
    $this->handleLike(Product::class, $id);
    return redirect()->back();
    }
    else{
        return redirect()->route('login')
    }
}

public function handleLike($type, $id)
{
    $existing_like = Like::withTrashed()->whereLikeableType($type)->whereLikeableId($id)->whereUserId(Auth::id())->first();

    if (is_null($existing_like)) {
        Like::create([
            'user_id'       => Auth::id(),
            'likeable_id'   => $id,
            'product_id'   => $id,
            'likeable_type' => $type,
        ]);
    } else {
        if (is_null($existing_like->deleted_at)) {
            $existing_like->delete();
        } else {
            $existing_like->restore();
        }
    }
}

我试图在控制器上按(Auth::check(),但这仅隐藏按钮。我该如何解决这个问题?

javascript php ajax laravel laravel-5
1个回答
1
投票

更好的选择是不重定向,而是返回未授权的错误,在JS中捕获该错误并重定向到登录页面。

error: function (xhr) {
  if (xhr.status == 401) {
    window.location.href = '/path/to/login';
  }
}

此外,您需要在控制器上返回401状态代码。

else{
  abort(401, 'You need to login again.');
}
© www.soinside.com 2019 - 2024. All rights reserved.