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...
希望对您有所帮助!
如何通过不重复我的代码,让我的控制器知道它返回的数据是 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...
希望对您有所帮助!