2
votes

try / catch PHP n'attrape pas les exceptions (contrôleur laravel)

Je travaille avec Laravel et j'essaie d'utiliser try / catch comme je le ferais pour java. Malheureusement, cela ne fonctionne pas comme prévu ... L'exception n'est pas interceptée, et au lieu de renvoyer un message d'erreur, elle crée une exception 422.

Voici ma fonction:

Route::post('memberform/changePassword','MemberController@changePassword')->name('changePassword');


1 commentaires

Comment envoyez-vous la demande?


5 Réponses :


1
votes

Utilisez getMessage () method.eg:-

$error->getMessage();

Utilisez ceci dans le bloc catch. Cela fonctionnera pour vous. Profitez !!


1 commentaires

Merci beaucoup mais cela ne "rattrape" pas vraiment l'exception: ma requête POST renvoie une exception: app.js: 800 POST 127.0.0.1/memberform/changePassword 422 (Entité non traitable) app.js: Erreur non interceptée (promis): la demande a échoué avec le code d'état 422 à createError



1
votes

Vous pouvez essayer ceci

public function changePassword(Request $request){

        try{
            if (!(Hash::check($request->get('currentpassword'), Auth::user()->password))) {
                return "Your current password does not matches with the password you provided. Please try again.";
            }

            if(strcmp($request->get('currentpassword'), $request->get('new-password')) == 0){
                return "New Password cannot be same as your current password. Please choose a different password.";
            }

            $validatedData = $request->validate([
                'currentpassword' => 'required',
                'newpassword' => 'required|string|min:6',
            ]);

            $user = Auth::user();
            $user->password = bcrypt($request->get('newpassword'));
            $user->save();

            return "Password changed successfully !";
        }
        catch(\Exception $error){
            return $error->getMessage();
        }
   }


1 commentaires

Merci mais comme j'ai répondu à Sahil aussi, merci beaucoup mais ça ne "rattrape" pas vraiment l'exception: ma requête POST ne renvoie pas le message mais une exception: app.js: 800 POST 127.0.0.1/memberform/ changePassword 422 (Entité non traitable) app.js: Uncaught (in promise) Error: La demande a échoué avec le code d'état 422 à createError -



2
votes

Votre code de gestion des erreurs est correct. Votre code pour attraper une exception est le moyen de le faire en PHP et cela fonctionne de la même manière qu'en Java (j'ai codé les deux). En bref, il n'y a rien de mal avec votre code.

1) Vous testez sur OSX et certains paramètres XDebug peuvent causer des problèmes de gestion des erreurs lorsque les choses sont massivement imbriquées (j'ai personnellement vécu cela dans les migrations). Problème de paramètres SO XDebug

2) Laravel a un intercepteur qui intercepte l'erreur quand elle se produit et ce gestionnaire a été injecté pour avoir la priorité avant votre gestionnaire. L'exception de validation du formulaire SO ne détecte pas

J'espère que cela vous poussera dans la bonne direction. Je suis désolé, c'est une réponse de type non-réponse.


0 commentaires

1
votes

La validation de Laravel échoue ne lance pas d'exception !! Donc, vous ne pouvez pas attraper ... Si vous voulez attraper, utilisez la validation personnalisée comme ci-dessous et lancez une exception vous-même

public function changePassword(Request $request)
{
    try
    {
       $data['currentpassword'] = $request->get('currentpassword');
       $data['newpassword'] = $request->get('newpassword');
        if (!(Hash::check($request->get('currentpassword'), Auth::user()->password))) {
            $message['currentpassword.required'] = "Your current password does not matches with the password you provided. Please try again.";
            $data['currentpassword'] = ""; // I used for required rule as a example , but I recommend to create custom rule for this
        }

        if(strcmp($request->get('currentpassword'), $request->get('new-password')) == 0){
            $message['newpassword.required'] = "New Password cannot be same as your current password. Please choose a different password.";
            $data['newpassword'] = "";// I used for required rule as a example , but I recommend to create custom rule for this
        }

        $rule = [
            'currentpassword' => 'required',
            'newpassword' => 'required|string|min:6',
        ];
        $validatedData = \Illuminate\Support\Facades\Validator::make($data, $rule, $message);
        if($validateData->fails()) {
           throw new \Exception($validateData->messages());
        }

        $user = Auth::user();
        $user->password = bcrypt($request->get('newpassword'));
        $user->save();

        return "Password changed successfully !";
    }
    catch(Exception $error)
    {
        return $error->getMessage();
    }
}


2 commentaires

La méthode validate () qui est utilisée lève une ValidationException. Jetez un œil à la classe Validator (située dans vendor / laravel / framework / src / Illuminate / Validation / Validatot sur Laravel 5.6).


Que jamais jeter! Vous obtiendrez le même message que j'ai testé sur laravel et que je l'ai utilisé



1
votes

Où renvoyez-vous l'erreur $, vous pouvez renvoyer $ error dans view () ou utiliser redirect () ou response () etc ...

exemple:

@if (session('error'))
    <div class="alert alert-danger" style="margin-top: 0.2rem;">
        {{ session('error') }}
    </div>
@endif

Un autre exemple:

return response()->json('error_message' => $error->getMessage());

J'espère que vous avez l'idée.

Dans la vue en lame, vous pouvez afficher $ message d'erreur comme ceci: p >

return back()->back()->withError($error->getMessage())->withInput();


0 commentaires