Laravel重置密码路由不起作用

时间:2018-04-14 16:01:17

标签: laravel authentication

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

  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

如果我现在输入该链接,我将直接转到密码/重置视图,而不是密码/重置/ {令牌}

但是,如果我将broswer中的链接更改为

https://myapp.dev/password/reset/451c70284a9d4b41123c4ec3efe83602b6cb955427ac48835200a45980bcf9f3 (更改"?"到" /")我工作

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

因为我使用了Auth:routes()是否有任何方法可以查看laravel在使用时产生的路由?

3 个答案:

答案 0 :(得分:1)

参数有两种不同的东西。

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

    <!-- When referencing resources from the 'android' namespace, omit the '@' symbol. --> <item name="@android:windowEnterAnimation"/>

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

首先,在你的路线上

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');

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

//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>