2017-06-13 62 views
-1

如何使我的控制器返回的数据是一个json不重复我的代码。Laravel如何使所有控制器返回数据为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'); 

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

回答

1

创建一个特征,您将包含在每个需要重用某些逻辑的控制器中。你可以抽象的特质里面的函数的那些行,像这样:

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 ...

我希望这帮助!

2

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

JSON响应DOC:

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

JSON响应

JSON的方法将自动设置Content-Type头为application/JSON,以及给定的数组转换成JSON使用PHP函数json_encode:

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

如果你和我ULD想要创建JSONP响应,则可以组合使用JSON方法与withCallback方法:

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

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