我有一个对所有用户可见的“喜欢”按钮,但我只希望经过身份验证的用户能够喜欢该产品,并且与该产品不同。如果客人试图喜欢,我想将他们重定向到登录页面。
刀片文件
<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()
,但这仅隐藏按钮。我该如何解决这个问题?
更好的选择是不重定向,而是返回未授权的错误,在JS中捕获该错误并重定向到登录页面。
error: function (xhr) {
if (xhr.status == 401) {
window.location.href = '/path/to/login';
}
}
此外,您需要在控制器上返回401状态代码。
else{
abort(401, 'You need to login again.');
}