try / catch PHP не перехватывает исключения (контроллер laravel) - PullRequest
0 голосов
/ 27 июня 2019

Я работаю с Laravel и пытаюсь использовать try / catch, как я сделал бы для java.К сожалению, оно не работает должным образом ... Исключение не перехватывается, и вместо возврата сообщения об ошибке создается исключение 422.

Вот моя функция:

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();
        }
   }

Я называю этот метод следующим образом

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

Здесь я хотел бы получить сообщение об исключении и отобразить его.Вместо этого я получаю сообщение об ошибке при использовании моего запроса, и это исключение не перехватывается

422 Unprocessable Entity {"message": "Указанные данные были недействительными.", "Errors": {"newpassword ": [" Новый пароль должен содержать не менее 6 символов. "]}}

Большое спасибо

Ответы [ 4 ]

1 голос
/ 28 июня 2019

Ошибка проверки Laravel не вызывает исключение !! Так что вы не можете поймать .... Если вы хотите поймать, используйте пользовательскую проверку, как показано ниже, и бросьте исключение самостоятельно

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();
    }
}
1 голос
/ 28 июня 2019

Вы можете попробовать это

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 голос
/ 28 июня 2019

Ваш код обработки ошибок правильный. Ваш код для перехвата исключения - это способ сделать это в PHP, и он работает так же, как в Java (я кодировал оба). Короче говоря, в вашем коде нет ничего плохого.

Мое предположение - одно из двух, и я не уверен на 100% ни в одном из них:

1) Вы тестируете на OSX, и некоторые настройки XDebug могут вызывать проблемы с обработкой ошибок, когда вещи в основном вложены (я лично испытывал это в миграциях). ТАК проблема с настройками XDebug

2) У Laravel есть перехватчик, который улавливает ошибку, когда она возникает, и этот обработчик был введен, чтобы иметь приоритет перед вашим обработчиком. Исключение проверки формы SO не перехватывается

Надеюсь, это подтолкнет вас в правильном направлении. Мне жаль, что это не ответ типа ответа.

1 голос
/ 27 июня 2019

Использовать getMessage() method.eg:-

$error->getMessage();

Использовать это в блоке catch.Это будет работать для вас.Наслаждайтесь !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...