Как обработать исключение на стороне сервера в Laravel - PullRequest
1 голос
/ 07 марта 2020

Как я могу обработать исключение на стороне сервера на Laravel? Я создаю API обновления и передаю неверное значение для обработки исключения, но не могу отловить эту ошибку с помощью блока try-catch. Кто-нибудь может мне помочь? Ниже приведен код:

{
"user_id" : "15835943395e63bb63c449d",
"changes" :{
    "username" : "new username",
    "name" : "new name",
    "statuss" : "inactive"
}
}

Итак, как вы можете видеть, я пытаюсь передать поле Invalid, то есть status фактическое значение status .

вот мой код для обработки этого:

try{
            $json = json_decode($changes,true);
            $update = 'SET ';
            $columns = [];
            $values = [];
            $pdo = DB::connection()->getPdo();
            foreach ($json as $key => $value) {
                $columns[]=$key;
                $values[]=$value;
                $update .= $key . '=?,';
            }
            $update = substr($update, 0, -1);
            $sql = "update users ".$update." where user_id='".$request->input('user_id')."'";
            $sth = $pdo->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY));
            $sth->execute($values);
        }
        catch (Exception $e) {
            echo $e;
        }

Но я ничего не получаю от почтальона.

Вот снимок:

enter image description here

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 07 марта 2020

Самый простой способ перехватить любой синтаксис или ошибки запроса sql - это перехватить Illuminate\Database\QueryException после закрытия запроса:

try { 
   $json = json_decode($changes,true);
        $update = 'SET ';
        $columns = [];
        $values = [];
        $pdo = DB::connection()->getPdo();
        foreach ($json as $key => $value) {
            $columns[]=$key;
            $values[]=$value;
            $update .= $key . '=?,';
        }
        $update = substr($update, 0, -1);
        $sql = "update users ".$update." where user_id='".$request->input('user_id')."'";
        $sth = $pdo->prepare($sql, array(\PDO::ATTR_CURSOR => \PDO::CURSOR_FWDONLY));
        $sth->execute($values);
} catch(\Illuminate\Database\QueryException $ex){ 
  dd($ex->getMessage()); 
  // Note any method of class PDOException can be called on $ex.
}

Если есть какие-либо ошибки, программа die(var_dump(...)) все, что нужно.

Примечание. Для пространств имен вам необходимо сначала \, если класс не включен как оператор use.

Также для справки: Laravel 6.x API - Исключение для запроса

0 голосов
/ 09 марта 2020

Хотя я и являюсь поклонником ответа @ Ronak для конца SQL, если вы хотите перехватить ошибку до выполнения любого SQL, вы можете использовать встроенный метод validate для проверки параметров API перед выполнением кода. Самое замечательное в этом то, что вам может потребоваться не только то, какие параметры присутствуют, но и какое значение должно быть - проверьте здесь для получения дополнительной информации.

В вашем контроллере:

public function validateRequest(Request $request) 
{
    $rules = ['status' => ['required', Rule::in(['inactive', 'active'])]];
    $messages = ['status' => 'Status is a required parameter and must be either inactive or active'];
    $this->validate($request, $rules, $messages);
}

Тогда в вашем блоке try просто

try {
     $this->validateRequest($request)
     // ... rest of code goes here
} catch (Exception $e) {
     return response()->json($e->getMessage(), 200); // response()->json() is a facade to return a JSON response 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...