Laravel 5.5 Ajax 注销没有重定向

Posted

技术标签:

【中文标题】Laravel 5.5 Ajax 注销没有重定向【英文标题】:Laravel 5.5 Ajax Logout no redirect 【发布时间】:2018-12-17 11:36:13 【问题描述】:

我正在尝试在刀片视图中创建一个注销按钮,该按钮可以在不重定向用户的情况下注销用户。我只想重新加载同一页面。

我认为 ajax 是最好的方法,(但我可能错了)。

这是我的按钮:

@if (auth()->check())
  <p>Vous êtes identifié en tant que <strong> auth()->user()->name </strong>. <a href="#" onclick="event.preventDefault(); document.getElementById('logout-form').submit();">Se déconnecter ?</a>
     <form id="logout-form" action=" url('/logout') " method="POST" style="display: none;">
          csrf_field() 
     </form>
   </p>
@endif

这是我的 ajax 函数:

<script>
// Ajax Logout
$('#logout-form').on('submit',function(e)
    e.preventDefault(e);
    var dest_url = " url('/logout') ";
  $.ajax(
    type:"POST",
    url:dest_url,
    data:$(this).serialize(),
    dataType: 'json',
    headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
    success: function(data)
      c = "success";
      t = "Succès";
      m = "Vous avez été déconnecté";
      i = "icon-circle-check";
      iziToast.show(
        class:"iziToast-"+c||"",
        title:t||"Sans titre",
        message:m||"-",
        animateInside:!1,
        position:"topRight",
        progressBar:!1,
        icon:i,
        timeout:9000,
        transitionIn:"fadeInLeft",
        transitionOut:"fadeOut",
        transitionInMobile:"fadeIn",
        transitionOutMobile:"fadeOut"
      );
    
  )
);
</script>

我的路线文件 (web.php)

Auth::routes();
Route::post('logout', '\App\Http\Controllers\Auth\LoginController@logout');

LoginController.php

 /**
 * Custom logout function with redirect back if ajax.
 *
 * @return void
 */
public function logout(Request $request) 
    $this->guard()->logout();
    $request->session()->invalidate();
    $request->session()->flash('errors', 'Vous êtes déconnecté');
    if($request->ajax()) 
        return Response::json(array(
            'success' => true,
            'data'   => 'Vous êtes déconnecté'
        )); 
    
    else 
        return redirect('/');
    

我想我错过了什么......

【问题讨论】:

你的dd($request-&gt;ajax())是什么? 我认为您可以在return redirect('/'); 中使用return redirect()-&gt;back();log out 之后返回上一页(不使用Ajax) 【参考方案1】:

我的请求没有被 Ajax 执行,所以我删除了logout-form 表单并监听了链接上的点击事件。

我的 ajax 函数中还有一个语法错误,在 'error:' 部分之前缺少一个 ','。

这是我的完整代码,没有多余的行:

退出按钮

@if (auth()->check())
    <p>Vous êtes identifié en tant que <strong> auth()->user()->name  </strong>. <a id="logout_btn" href="#">Se déconnecter ?</a>
    </p>
@endif

Ajax 函数

<script>
// Ajax Logout
    $('#logout_btn').click(function(e)

        e.preventDefault();
        var dest_url = " url('/logout') ";
  $.ajax(
    type:"POST",
    url:dest_url,
    headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
    success: function()
      c = "success";
      t = "Succès";
      m = "Vous avez été déconnecté";
      i = "icon-circle-check";
      iziToast.show(
        class:"iziToast-"+c||"",
        title:t||"Sans titre",
        message:m||"-",
        animateInside:!1,
        position:"topRight",
        progressBar:!1,
        icon:i,
        timeout:9000,
        transitionIn:"fadeInLeft",
        transitionOut:"fadeOut",
        transitionInMobile:"fadeIn",
        transitionOutMobile:"fadeOut"
      );
      $('form[name="reservation"]').load(document.URL +  ' form[name="reservation"]');
      $('.toolbar .account').load(document.URL +  ' .toolbar .account');

    ,
    error: function()
      console.log('Erreur lors de la déconnection via Ajax');

      c = "danger";
      t = "Erreur";
      m = "Une erreur s'est produite lors de la déconnection";
      i = "icon-ban";
      iziToast.show(
        class:"iziToast-"+c||"",
        title:t||"Sans titre",
        message:m||"-",
        animateInside:!1,
        position:"topRight",
        progressBar:!1,
        icon:i,
        timeout:9000,
        transitionIn:"fadeInLeft",
        transitionOut:"fadeOut",
        transitionInMobile:"fadeIn",
        transitionOutMobile:"fadeOut"
      );
    
  )
);
</script>

登录控制器

/**
 * Custom logout function with no redirect if ajax.
 *
 * @return void
 */
public function logout(Request $request) 
    $this->guard()->logout();
    $request->session()->invalidate();
    if($request->ajax()) 
        return Response::json(array(
            'success' => true,
            'data'   => 'Vous êtes déconnecté'
        )); 
    
    else 
        return redirect('/');
    

【讨论】:

以上是关于Laravel 5.5 Ajax 注销没有重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何设置 laravel 5.3 注销重定向路径?

注销重定向到管理仪表板 laravel

登录和注销后如何重定向 - laravel 5

使用ajax重定向到Laravel中的特定页面

如何在laravel 5.5中会话时自动重定向到登录页面

Laravel 5.5登录后重定向到特定路由