我正在构建自定义视图以重置密码。 路线如下:
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在使用时产生的路由?
答案 0 :(得分:1)
参数有两种不同的东西。
路由参数:这些路由参数包含在带有“/”的路由中。你可以通过以下方式获得它们:
<!-- When referencing resources from the 'android' namespace, omit the '@' symbol. -->
<item name="@android:windowEnterAnimation"/>
请求参数:这些是在'?'之后附加在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>