【问题标题】:How to set laravel 5.3 logout redirect path?如何设置 laravel 5.3 注销重定向路径?
【发布时间】:2017-01-12 16:04:15
【问题描述】:

在 Laravel 5.3 中退出后,是否没有优雅的解决方案可以重定向到特定页面?

被调用的函数来自特征AuthenticatesUsers

public function logout(Request $request)
{
    $this->guard()->logout();

    $request->session()->flush();

    $request->session()->regenerate();

    return redirect('/');
}

这是来自 laravel 核心的默认函数。所以我必须覆盖我无法编辑核心的整个功能。 但是没有更简单的解决方案吗,因为手动注销、刷新和重新生成感觉有点矫枉过正。

在一篇文章中得出了答案: https://codeneverlied.com/how-to-set-logout-redirect-path-in-laravel-5-8-and-before/

【问题讨论】:

  • 你想做什么改变?
  • return redirect()->route('yourroute');
  • 我希望我可以在我的 LoginController 中设置一些简单的东西,比如 protected $logoutRedirectPath = 'my/path/'; 但是注销方法应该是 return property_exists($this, 'logoutRedirectPath') ? $this->logoutRedirectPath : '/';
  • 你应该可以使用这样的东西 - stackoverflow.com/questions/29797433/…
  • @AndyHolmes 我希望这样做,但这在 5.3 中不再适用。查看正在调用的方法。

标签: php laravel laravel-5.3


【解决方案1】:

我刚刚将一个旧网站更新到 Laravel 5.3。这包括按照upgrade guide 中的建议从Laravel Github 添加4 个新的Auth 控制器。

三个新的控制器:RegisterController.php、LoginController.php 和 ResetPaswordController.php 都包含一个代码块

/**
 * Where to redirect users after resetting their password.
 *
 * @var string
 */
protected $redirectTo = '/home';

只需将 /home 更改为所需的重定向位置。至少在 Laravel 5.3 中这对我有用(数据 2021 年 4 月)

【讨论】:

    【解决方案2】:

    在我的情况下,我希望它在注销后将用户重定向到主页'/home',但它一直将他重定向到登录页面
    原因是默认的HomeController使用了auth中间件

    我不得不从 __construct 方法中删除这一行 $this->middleware('auth');

    【讨论】:

      【解决方案3】:

      如果我们查看 Laravel 在 AuthenticatesUsers trait 上的默认注销功能代码(对于 laravel 7,它位于 vendor/laravel/ui/auth-backend/AuthenticatesUsers 下),我们将看到用于重定向的硬编码路径。这意味着我们需要从源代码更改 url,但是通过供应商编辑文件是错误的方式,但是特性为我们提供了一种更好的方式,我们可以覆盖代码所以只需将所有注销功能的代码粘贴到 LoginController 页面并更改redirect('/') 函数的参数到你想要的任何 url。 目前我的代码看起来就像那些只是把它放在 LoginController 上:

      /**
       * Log the user out of the application.
       *
       * @param  \Illuminate\Http\Request  $request
       * @return \Illuminate\Http\Response
       */
      public function logout(Request $request)
      {
          $this->guard()->logout();
      
          $request->session()->invalidate();
      
          $request->session()->regenerateToken();
      
          if ($response = $this->loggedOut($request)) {
              return $response;
          }
      
          return $request->wantsJson()
              ? new Response('', 204)
              : redirect('/login');
      }
      

      【讨论】:

        【解决方案4】:

        Illuminate Support 包:覆盖 LoginController.php 中的注销方法

         use Illuminate\Support\Facades\Auth;
        
         public function logout()
             {
                 Auth::logout();
        
             return redirect('/wherever/you/want');
         }
        

        【讨论】:

          【解决方案5】:

          假设有人现在正在查看它,并且他们使用的 laravel 版本是 5.7

          在 LoginController.php 中添加这一行

          public function logout()
          {
              Auth::logout();
              return redirect()->to('/your-route');
          }
          

          这假设您使用的是 laravel 提供的开箱即用的身份验证模块

          【讨论】:

          • 别忘了添加Auth类,使用Auth;
          • 在 Laravel 6.7 确认
          【解决方案6】:

          Laravel 5.8 中找到以下路径:

          App\Http\Controllers\Auth\LoginController.php

          use Illuminate\Http\Request;*
          

          编写这个函数

          public function logout(Request $request){
              $this->guard()->logout();
          
              $request->session()->invalidate();
          
              return $this->loggedOut($request) ?: redirect('/Where/You/want/to/redirect');;
          }
          

          【讨论】:

          • 不要更改供应商文件夹中的文件。当您运行 composer update 时,此更改将消失。这不是一个好的解决方案。
          • 谢谢蒂姆·范乌姆。现在我发布了一个新答案。
          【解决方案7】:

          Laravel > 5.7

          接受的答案很好,但您可以完全绕过任何注销逻辑,只需覆盖loggedOut 方法:

          // App\Http\Controllers\Auth\LoginController.php
          protected function loggedOut(Request $request) {
              return redirect('/where/ever/you/want/to/go');
          }
          

          【讨论】:

          • 不用担心。只是对源代码进行了一些挖掘
          • 也适用于 5.6
          • 你好,请问我应该在哪个文件中覆盖这个方法?
          • 可能是这里唯一正确的答案!确保Request命名空间包含在Controller中,即:use Illuminate\Http\Request;
          • @Hatef 这对 laravel 5.7+ 有好处,但问题是 laravel 5.3,其中这个答案是错误的。但在这里提一下还是不错的,因为很多人最终会来到这里。
          【解决方案8】:

          接受的答案很好,但您可以通过简单地覆盖loggedOut方法来完全绕过任何注销逻辑:

          protected function loggedOut(Request $request) {
              return redirect('/where/ever/you/want/to/go');
          }
          

          【讨论】:

            【解决方案9】:

            只需在 routes/web.php 中使用它

            Route::get('logout', function (){
            Auth::logout();
            return redirect('your URL');
            });
            

            【讨论】:

              【解决方案10】:

              为避免重复注销代码并遵循 DRY,您可以

              • Auth/LoginController中添加自定义注销路由,调用 Auth::logout() 并返回重定向到您的路径,或者
              • 添加一个after-middleware(比如redirectAfterLogout)并将其添加到注销路由中

              【讨论】:

                【解决方案11】:

                如果您使用的是开箱即​​用的 AuthController,请将此变量添加到顶部,然后更改字符串以重定向到您想要的任何位置。

                protected $redirectAfterLogout = '/';
                

                AuthenticatesUsers 类有一个注销函数来检查这个变量。

                public function logout()
                {
                        Auth::guard($this->getGuard())->logout();
                
                    return redirect(property_exists($this, 'redirectAfterLogout') ? $this->redirectAfterLogout : '/');
                }
                

                【讨论】:

                  【解决方案12】:

                  laravel 5.3 中的 Auth::routes 方法为 /logout 注册了一个 POST 路由,而不是一个 GET 路由。这可以防止其他 Web 应用程序将您的用户从您的应用程序中注销。要升级,您应该将您的注销请求转换为使用 POST 动词,或者通过将此路由添加到文件 Routes/web.php 来为 /logout URI 注册您自己的 GET 路由:-

                  Route::get('/logout', 'Auth\LoginController@logout');
                  

                  它应该可以正常工作并将您重定向到 LoginController.php 中定义的“/”目录

                  引自:-

                  https://laravel.com/docs/5.3/upgrade

                  【讨论】:

                  • 谢谢,这很有帮助
                  【解决方案13】:

                  我用的是Laravel-5.2,我用的是:

                  public function logout()
                  {
                      Auth::logout();
                      Session::flush();
                      return redirect('/');
                  }
                  

                  确保您已导入:

                  use Illuminate\Support\Facades\Auth;
                  use Illuminate\Support\Facades\Session;
                  

                  在您的控制器中。

                  【讨论】:

                  • 我很害怕。我认为它非常丑陋。应该可以使用 protected $logoutRedirectPath = 'path'; 之类的东西向 LoginController(5.2 中的 AuthController)添加一个属性
                  • 感谢您的回答。如果可能的话,我可以知道它的来源(或者如果你记得吗?),为你 +1 我的朋友
                  • @IslamElshobokshy 抱歉,我现在不记得了,因为已经有好几年了 :)
                  【解决方案14】:

                  我就是这样做的。在 Auth\LoginController 你有:

                  use AuthenticatesUsers;
                  

                  改成:

                  use AuthenticatesUsers {
                      logout as performLogout;
                  }
                  

                  然后,在你的 LoginController 中定义一个新的 logout() 方法:

                  public function logout(Request $request)
                  {
                      $this->performLogout($request);
                      return redirect()->route('your_route');
                  }
                  

                  当然,该特征中的常规 logout() 方法只有 3 行(用于将用户从系统中注销),因此您可以将它们复制到您的方法中,但您应该始终遵循 DRY 原则(不要重复自己) 并尽可能多地重复使用代码。

                  【讨论】:

                  • 嗨@avram,我对use … { … as … } 中的语法有疑问。它看起来有点像导入/解构。你知道这个语法/模式的名称是什么吗?感谢您的帮助,它适用于我正在进行的项目!
                  • @meduz' 我不太清楚它是怎么调用的,我刚刚在 PHP 文档中找到了它:php.net/manual/en/…
                  • 唯一没有提到的是在LoginController中包含use Illuminate\Http\Request;
                  【解决方案15】:

                  你可以去vendor\laravel\framework\src\Illuminate\Foundation\Auth\AuthenticatesUsers.php 在函数logout 中将return redirect('/'); 更改为您的路由地址。

                  【讨论】:

                  • 这是非常糟糕的做法!如果您运行composer update,您的更改就消失了。切勿更改供应商文件夹中的文件。
                  【解决方案16】:

                  最简单的方法是像这样在App\Http\Controllers\Auth\LoginController 中覆盖LoginController 的注销特征

                  public function logout(Request $request){
                      $this->guard()->logout();
                      $request->session()->flush();
                      $request->session()->regenerate();
                  
                      return redirect()->route('you_route_name');
                  }
                  

                  【讨论】:

                  • 想知道为什么你只有 3 票,最聪明和最聪明的选择。
                  【解决方案17】:

                  我会继承 LoginController 并覆盖来自那里的 trait 的 logout 函数:

                  LoginController.php -> 保持原样。

                  MyLoginController.php

                  class MyLoginController extends LoginController {
                  
                  protected $redirectAfterLogout = '/goodbye';
                  
                      public function logout(Request $request)
                      {
                          $this->guard()->logout();
                          $request->session()->flush();
                          $request->session()->regenerate();
                          return redirect($this->redirectAfterLogout);
                      }
                  }
                  

                  当然,您应该记得相应地更新您的 Auth 路由。

                  【讨论】:

                  • 已经在使用这个了。但是不需要扩展 LoginController,因为控制器是开放的,可以修改。只需将方法添加到 LoginController。因为该方法位于 LoginController 中使用的特征中。这似乎是解决方案,没有在事件内触发重定向,因此事件不是一个选项
                  • 你是对的,在 LoginController 本身中定义 logout 覆盖是非常好的,我只是想将没有“内置”的东西保存在我自己的单独文件中。
                  • 在 laravel 5.3 中就像一个魅力,但你可以直接编辑 LoginController 并覆盖注销方法 - 无论如何,如果它能够像成功登录后的重定向那样实现会很好
                  • @Kaloyan Doichinov,看来你是 laravel 大师。我需要你帮忙。看这里:stackoverflow.com/questions/41047583/…
                  【解决方案18】:

                  每个注销操作都会触发一个事件Events\Logout。您可以创建一个侦听器来侦听此事件并在其中添加一些逻辑。在此处查看有关听众的更多信息https://laravel.com/docs/5.3/events

                  【讨论】:

                  • 发现事件并触发。但是有些东西使它无法重定向。在事件中我有return redirect()->route('admin::login');,但它没有被触发。事件至少会更干净一些。同样使用普通的header('Location: /'); 也不起作用。
                  猜你喜欢
                  • 2017-05-14
                  • 1970-01-01
                  • 2017-05-15
                  • 2017-02-28
                  • 2017-04-17
                  • 2018-01-23
                  • 2017-04-12
                  • 1970-01-01
                  • 2017-01-24
                  相关资源
                  最近更新 更多