Route [password.reset] 未在 Laravel 5.4 中的 ResetPasswords.php 中定义
Posted
技术标签:
【中文标题】Route [password.reset] 未在 Laravel 5.4 中的 ResetPasswords.php 中定义【英文标题】:Route [password.reset] not defined in laravel 5.4 in ResetPasswords.php 【发布时间】:2017-10-18 09:11:48 【问题描述】:我的自定义应用程序中出现此错误:
InvalidArgumentException in UrlGenerator.php line 304:
Route [password.reset] not defined.
我知道 laravel 提供了开箱即用的密码重置功能,但我想编写自己的类和路由。
这是我在 web.php 中的路线
// Password reset link request routes...
Route::get('password/email', 'Auth\PasswordController@getResetEmail');
Route::post('password/email', 'Auth\PasswordController@postResetEmail');
// Password reset routes...
Route::get('password/reset/token', 'Auth\PasswordController@getReset');
Route::post('password/reset', 'Auth\PasswordController@postReset');
这是我的 PasswordController:
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Contracts\Auth\PasswordBroker;
use Illuminate\Foundation\Auth\ResetsPasswords;
class PasswordController extends Controller
use ResetsPasswords;
/**
* Create a new password controller instance.
*
* @param \Illuminate\Contracts\Auth\Guard $auth
* @param \Illuminate\Contracts\Auth\PasswordBroker $passwords
* @return void
*/
public function __construct(Guard $auth, PasswordBroker $passwords)
$this->auth = $auth;
$this->passwords = $passwords;
$this->middleware('guest');
这是我的 ResetPasswords.php 特征:
namespace Illuminate\Foundation\Auth;
use Illuminate\Http\Request;
use Illuminate\Mail\Message;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Password;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
trait ResetsPasswords
use RedirectsUsers;
/**
* Display the form to request a password reset link.
*
* @return \Illuminate\Http\Response
*/
public function getResetEmail()
return view('public.auth.password');
/**
* Send a reset link to the given user.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function postResetEmail(Request $request)
$this->validate($request, ['email' => 'required|email']);
$response = Password::sendResetLink($request->only('email'), function (Message $message)
$message->subject($this->getEmailSubject());
);
switch ($response)
case Password::RESET_LINK_SENT:
return redirect()->back()->with('status', trans($response));
case Password::INVALID_USER:
return redirect()->back()->withErrors(['email' => trans($response)]);
/**
* Get the e-mail subject line to be used for the reset link email.
*
* @return string
*/
protected function getEmailSubject()
return property_exists($this, 'subject') ? $this->subject : 'Your Password Reset Link';
/**
* Display the password reset view for the given token.
*
* @param string $token
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
public function getReset($token = null)
if (is_null($token))
throw new NotFoundHttpException;
return view('public.auth.reset')->with('token', $token);
/**
* Reset the given user's password.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function postReset(Request $request)
$this->validate($request, [
'token' => 'required',
'email' => 'required|email',
'password' => 'required|confirmed|min:6',
]);
$credentials = $request->only(
'email', 'password', 'password_confirmation', 'token'
);
$response = Password::reset($credentials, function ($user, $password)
$this->resetPassword($user, $password);
);
switch ($response)
case Password::PASSWORD_RESET:
return redirect($this->redirectPath())->with('status', trans($response));
default:
return redirect()->back()
->withInput($request->only('email'))
->withErrors(['email' => trans($response)]);
/**
* Reset the given user's password.
*
* @param \Illuminate\Contracts\Auth\CanResetPassword $user
* @param string $password
* @return void
*/
protected function resetPassword($user, $password)
$user->password = bcrypt($password);
$user->save();
Auth::login($user);
问题是当我按下密码重置表单按钮时会导致该错误。
任何帮助将不胜感激......
【问题讨论】:
【参考方案1】:这些路线需要一个名字。
这里是代码..
// Password reset link request routes...
Route::get('password/email', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.email');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail');
// Password reset routes...
Route::get('password/reset/token', 'Auth\ResetPasswordController@showResetForm')->name('password.request');
Route::post('password/reset', 'Auth\ResetPasswordController@postReset')->name('password.reset');
【讨论】:
FWIW,我需要切换password.reset
和 password.request
的名称。它们应该在此处翻转 - 否则您会在电子邮件中使用 ?代币。【参考方案2】:
在laravel 5.4中sendResetLink
只有一个参数credentials
所以你必须把你的方法实现改成这样:
$response = $this->passwords->sendResetLink($request->only('email'));
然后你必须把回调放到User
模型(或者你到底有什么)有
trait CanResetPassword
这个模型必须有方法:
public function sendPasswordResetNotification($token)
// do your callback here
【讨论】:
【参考方案3】:路线
route('password.email')
返回/password/reset/token
和路线
route('password.request')
返回/password/reset
写这个的人那天晚上肯定很累,但我想现在改框架已经太晚了
【讨论】:
【参考方案4】:如果你的重置链接在 url 上包含 localhost,记得更改 .env 文件上的 APP_URL,然后运行:php artisan config:clear
【讨论】:
以上是关于Route [password.reset] 未在 Laravel 5.4 中的 ResetPasswords.php 中定义的主要内容,如果未能解决你的问题,请参考以下文章
Windows server 2008 R2 & Win 7 Password reset
Community Partner User password reset / 重置合作伙伴用户的密码