Laravel 5捕获异常时如何返回json数据?

 2021-04-26 

How can I return json data when Laravel 5 catch exception?

当laravel捕获异常时,如何返回json数据?
当数据库中不存在Json数据时,我想返回该数据。

当laravel从数据库中找到记录时,它会返回正确的json数据。
如果laravel无法搜索任何记录,则不会提供json数据!
laravel重新修改了显示"糟糕的东西,好像出现了问题"的页面。并提供soem额外的信息" ModelNotFoundException"。

以下代码是我尝试的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
    public function show($id)
    {
            try {
                    $statusCode = 200;
                    $response = [
                            'todo' => []
                    ];

                    $todo = Todo::findOrFail($id);

                    $response['todo']= [
                            'id'       =>       $todo->id,
                            'title'    =>       $todo->title,
                            'body'     =>       $todo->body,
                    ];

            } catch(Exception $e) {
                    // I think laravel doesn't go through following exception
                    $statusCode = 404;  
                    $response = [
                           "error" =>"You do not have that record"
                    ];

            } finally {
                    return response($response, $statusCode);

            }
   }


我解决了问题。首先,我将findOrFail方法更改为find方法。其次,我意识到Exception,并且Illuminate \\\\ Database \\\\ Eloquent \\\\ ModelNotFoundException $ e无法捕获任何内容。因此,我更改为if条件。然后就可以了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    public function show($id)
    {        
            $statusCode = 200;
            $response = [
                    'todo' => []
            ];

            $todo = Todo::find($id);

            if ( is_null($todo) ) {
                    $statusCode = 404;
                    $response = [
                           "error" =>"The record doesn't exist"
                    ];

            } else {
                    $response['todo']= [
                            'id'       =>       $todo->id,
                            'title'    =>       $todo->title,
                            'body'     =>       $todo->body,
                    ];

            }

            return response($response, $statusCode);
    }