【问题标题】:Laravel reset password route not workingLaravel重置密码路由不起作用
【发布时间】:2018-09-24 18:44:42
【问题描述】:

我正在构建自定义视图来重置密码。 路线如下所示:

  Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.reset');
  Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
  Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset.token');
  Route::post('password/reset', 'Auth\ResetPasswordController@reset');

ResetPasswordController.php我添加了这个:

//Show form to seller where they can reset password
    public function showResetForm(Request $request, $token = null)
    {
        return view('auth.passwords.reset')->with(
            ['token' => $token, 'email' => $request->email]
        );
    }

发送给我的链接如下所示:

https://myapp.dev/password/reset?451c70284a9d4b41123c4ec3efe83602b6cb955427ac48835200a45980bcf9f3

如果我现在输入该链接,我将直接进入 password/reset 视图,而不是 password/reset/{token}

但是,如果我将浏览器中的链接更改为

https://myapp.dev/password/reset/451c70284a9d4b41123c4ec3efe83602b6cb955427ac48835200a45980bcf9f3 (将“?”改为“/”)我成功了

那为什么不呢?版本的 URL 工作?我正在使用 laravel 5.5

由于我不使用 Auth:routes(),有什么方法可以查看 laravel 使用它时生成的路由吗?

【问题讨论】:

    标签: laravel authentication


    【解决方案1】:

    参数有两种不同的东西。

    1. 路由参数:这些包含在带有“/”的路由中,如您的示例所示。您可以通过以下方式获得它们:

      $request->parameter('parameter_name'); $request->parameters(); // for all parameters

    2. 请求参数:这些是附加在 URL 中“?”之后的请求参数。参数在 GET 请求中以这种方式发送。您可以通过以下方式获得它们:

      $request->input('parameter_name'); $request->all(); // for all parameters

    【讨论】:

    • 我应该如何更改我的代码以使Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset.token'); 工作?
    • 你是自定义邮件模板还是使用 laravel 的默认模板?
    • 我默认使用 Laravel
    • Auth::routes()Illuminate/Routing/Router.phpauth() 函数中定义。将您的路线与这些路线进行比较,它可能会解决问题。 Laravel 将令牌路由定义为 password.reset
    【解决方案2】:

    Laravel doc..

    您可能对必需参数可选参数感到困惑。

    当您定义以下路线时..

      Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset.token');
    

    Laravel 期望 token 值作为路由第三段中的必需参数。

    但是当你访问路由时

    https://myapp.dev/password/reset?451c70284a9d4b41123c4ec3efe8360..

    路线只有两段。令牌值被分配为get 参数或可选参数。 正如您已经定义如下..

    Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.reset');
    

    您生成的链接指向password/reset?451c70284a9d4b41123c4ec3efe83602b6cb955427ac48835200a45980bcf9f3 值作为get 参数传递。

    要触发您的重置,请遵循以下路线

    Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset.token');
    

    您应该使用以下链接格式

    https://myapp.dev/password/reset/451c70284a9d4b41123c4ec3efe83602b6cb955427ac48835200a45980bcf9f3

    【讨论】:

      【解决方案3】:

      首先,在你的路线中

      Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.reset');
      

      将优先于您的网址。因为路由是在顶部声明的,因此将首先进入该 showLinkRequestForm 函数。

      同时,在您的“/{token}”中,您通过 get 路由发送的值将带有斜线。目前你得到的。

      Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset.token');
      

      请注意,路由声明的位置也会影响 .给定 2 个具有相同 url 但名称不同的路由的示例

      //1st password/reset
      Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.reset');
      
      //2nd password/reset 
      Route::get('password/reset', 'Auth\ForgotPasswordController@showTokenForm')->name('password.reset.form');
      

      在这种情况下,路由命名将采用最新/最后的声明,即第二个密码/重置,第一个密码/重置将被忽略或变为不可用(已测试)。

      所以回答你问 Muhammad Nauman 的问题:

      “我应该如何更改我的代码以获得给定的工作路线?”

      Route::get('password/reset/{token}', 
      'Auth\ResetPasswordController@showResetForm')->name('password.reset.token');
      

      在刀片模板中你可以调整你的路由值看起来像这样

      <a href="{{route('password.reset.token',['token'=> $token_value ])}}">Reset Form</a>
      

      在你的新 ResetPasswordController.php 中

      public function showResetForm(Request $request)
      {
          $token = $request->route()->parameter('token');
      
          return view('auth.passwords.reset')->with(
              ['token' => $token, 'email' => $request->email]
          );
      }
      

      但是,如果您有点喜欢通过 GET 请求令牌电子邮件的肮脏方式 "?token="somevalue"&email="somevalue" 你可以这样做

      public function showResetForm()
      {
        return view('auth.passwords.reset')->with(
              ['token' => request('token'), 'email' => request('email')]
          );
      }
      

      然后在刀片中添加电子邮件的附加路由参数

      <a href="{{route('password.reset.token',['token'=> $token_value,'email'=> $user->email ])}}">Reset Form</a>
      

      【讨论】:

        猜你喜欢
        • 2014-07-24
        • 2019-01-28
        • 2015-07-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-22
        • 2016-11-05
        • 2015-01-26
        • 2015-03-13
        相关资源
        最近更新 更多