【问题标题】:Route [password.reset] not defined in laravel 5.4 in ResetPasswords.phpRoute [password.reset] 未在 Laravel 5.4 中的 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);
    }
}

问题是当我按下密码重置表单按钮时会导致该错误。

任何帮助将不胜感激......

【问题讨论】:

    标签: php laravel-5.4 forgot-password


    【解决方案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.resetpassword.request 的名称。它们应该在此处翻转 - 否则您会在电子邮件中使用 ?代币。
    【解决方案2】:

    laravel 5.4sendResetLink只有一个参数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

        【讨论】:

          猜你喜欢
          • 2017-09-05
          • 2017-10-25
          • 1970-01-01
          • 2017-07-07
          • 2019-01-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-07-30
          相关资源
          最近更新 更多