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

时间:2017-06-13 23:23:14

标签: php json laravel laravel-5 backend

如何通过不重复我的代码使我的控制器返回的数据是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');

他们是以更好的方式做到这一点吗?

2 个答案:

答案 0 :(得分:3)

Laravel包含JSON响应,但如果您只是返回集合,Laravel 5.4也会输出JSON。

JSON响应文档:

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

JSON回复

json方法会自动将Content-Type标头设置为application / json,并使用json_encode PHP函数将给定数组转换为JSON:

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

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

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

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

答案 1 :(得分:1)

创建一个Trait,您将在每个需要重用某些逻辑的控制器中包含该Trait。您可以在特征内的函数中抽象这些行,如下所示:

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)

    }
}

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

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

更多关于traits ...

我希望这有帮助!