web-dev-qa-db-fra.com

La route [password.reset] n'est pas définie dans laravel 5.4 dans ResetPasswords.php

Je reçois cette erreur dans mon application personnalisée:

InvalidArgumentException in UrlGenerator.php line 304: 
Route [password.reset] not defined.

Je sais que Laravel fournit une fonctionnalité de réinitialisation de mot de passe prête à l'emploi, mais je veux écrire ma propre classe et mes propres routes.

Voici mes itinéraires dans 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');

Et voici mon 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');
    }
}

Ceci est mon trait 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);
    }
}

Le problème est que lorsque j'appuie sur le bouton du formulaire de réinitialisation du mot de passe, cela conduit à cette erreur. Je ne sais pas quel est le problème, mais il semble que phpstorm ne reconnaisse pas la méthode Password :: sendResetLink de la classe PasswordBroker et met en surbrillance la méthode en jaune et affiche ce message à bulle:

Method sendResetLink not found in Illuminate\Support\Facades\Password
Refreced method is not found in subject class

Je ne sais pas quelle est la relation entre cette méthode et les routes?

Toute aide serait appréciée...

8
Salar Bahador

Dans le laravel 5.4 sendResetLink n'a qu'un paramètre credentials 

Vous devez donc modifier votre implémentation de méthode en ceci:

$response = $this->passwords->sendResetLink($request->only('email'));

Ensuite, vous devez mettre en rappel le modèle User (ou ce que vous avez exactement) qui a 

trait CanResetPassword

Ce modèle doit avoir une méthode:

public function sendPasswordResetNotification($token) {
    // do your callback here
}
5
Alex Slipknot

ces itinéraires ont besoin d'un nom.

Voici le code ..

// 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');
10
a3rxander

Route

{{ route('password.email') }}

renvoie /password/reset/{token}

et route

{{ route('password.request') }}

renvoie /password/reset

Celui qui a écrit ça devait être vraiment fatigué cette nuit-là, mais je suppose qu'il est trop tard pour changer le cadre à ce stade

2
Arthur Tarasov

Si votre lien de réinitialisation contient localhost sur l'URL, n'oubliez pas de modifier APP_URL sur le fichier .env puis exécutez: php artisan config: clear

0
JavierE