Laravel 如何让所有控制器返回数据为 json

Laravel how to make all controller returned data as json

如何通过不重复我的代码,让我的控制器知道它返回的数据是 json。

示例控制器

public function getTeams(Request $request){
    $result = Team::where('competitionId',$request->input('competitionId',9224))
        ->orderBy('teamName')    
        ->get(['teamId as id','teamName as name']);
    return response($result, 200)
        ->header('Access-Control-Allow-Origin', '*')
        ->header('Content-Type', 'application/json');
}

public function getTeamStats(Request $request) {
    if($request->id){
        $result = TeamCompetitionStatistics::getTeamStats($request->id);
        return response($result, 200)
            ->header('Access-Control-Allow-Origin', '*')
            ->header('Content-Type', 'application/json');
    }
}

如你所见,我已经将这部分重复了两次

return response($result, 200)
->header('Access-Control-Allow-Origin', '*')
->header('Content-Type', 'application/json');

他们有更好的方法来做到这一点吗?

Laravel 包含 JSON 响应,但 Laravel 5.4 也将输出 JSON 如果您只是 return collection.

JSON 响应文档:

https://laravel.com/docs/5.4/responses#json-responses

JSON 回应

json 方法会自动将 Content-Type header 设置为 application/json,并使用 [=] 将给定数组转换为 JSON 32=] PHP 函数:

return response()->json([
    'name' => 'Abigail',
    'state' => 'CA'
]);

如果您想创建一个 JSONP 响应,您可以结合使用 json 方法和 withCallback 方法:

return response()
        ->json(['name' => 'Abigail', 'state' => 'CA'])
        ->withCallback($request->input('callback'));

除此之外,执行重复逻辑的一种简单方法是将其提取到基本控制器中的方法中 class。

创建一个特征,您将把它包含在每个需要重用特定逻辑的控制器中。您可以像这样在特征内的函数中抽象这些行:

trait MyResponseTrait{

    public function successfulResponse($result)
    {
      return response($result, 200)
      ->header('Access-Control-Allow-Origin', '*')
      ->header('Content-Type', 'application/json');
    }
}

您的代码将如下所示:

public function getTeams(Request $request){
    $result = Team::where('competitionId',$request->input('competitionId',9224))
        ->orderBy('teamName')    
        ->get(['teamId as id','teamName as name']);
    return successfulResponse($result);
}

public function getTeamStats(Request $request) {
    if($request->id){
        $result = TeamCompetitionStatistics::getTeamStats($request->id);
        return successfulResponse($result)

    }
}

请注意,您必须在控制器中包含 Trait,例如:

class Controller extends BaseController
{
    use MyResponseTrait;
    // Will be able to call successfulResponse() inside here...
}

更多关于traits...

希望对您有所帮助!