2017-02-19 13 views
0

엔드 포인트에서 사용할 수있는 RESTful 서비스가 있습니다.Laravel에서 응답을 변경하는 방법?

예를 들어 api/main을 요청하고 서버에서 JSON 데이터를 가져옵니다. 응답시

내가 사용

return response()->json(["categories" => $categories]); 

어떻게 URL에 매개 변수를 전달 응답의 형식을 제어하기 위해?

샘플로 내가 필요합니다 : api/main?format=json|html 컨트롤러에서 각 response에 대해 작동합니다. 당신의 format 쿼리 매개 변수의 예와

+0

어떻게 응답을 'HTML'형식으로 지정 하시겠습니까? –

+0

'View'가 리턴되어야합니다 – Darama

+0

지금까지 시도한 것이 있습니까? –

답변

1

Response macros에 사용할 수 있습니다.

\Response::macro('custom', function($view, $data) { 
    if (\Request::input('format') == 'json') { 
      return response()->json($data); 
    } 
    return view($view, $data); 
}); 

및 컨트롤러에 당신은 지금 사용할 수 있습니다 : 예를 들어 AppServiceProviderboot 방법 안에 당신은 추가 할 수 있습니다

$data = [ 
    'key' => 'value', 
]; 

return response()->custom('your.view', $data); 

을 지금 예를 GET /categories에 대한 정상적인 HTML 페이지를 얻을 것이다 실행하면,하지만 경우 GET /categories?format=json를 실행하면 Json 응답을 받게됩니다. 그러나 귀하의 필요에 따라 리다이렉트 등을 처리하기 위해 더 많은 것을 사용자 정의해야 할 수도 있습니다.

0

컨트롤러 코드는 다음과 같이 보일 것이다 : 들어오는 요청이 $request->ajax()

+0

문제는 각 컨트롤러에이 코드를 작성하고 싶지 않고 DRY 원칙이 필요합니다. – Darama

+0

일반적인 논리를 도우미 메서드로 추출하는 것을 막을 수있는 방법은 없습니다. – nCrazed

+0

그리고 Ross가 제안한 것처럼 컨트롤러에서'$ data' 배열을 반환하고 사용자 정의 미들웨어가 올바른 유형의 응답으로 변환되도록 처리 할 수 ​​있습니다. – nCrazed

0

하나의 옵션으로 $request->input('format') === 'json'를 통해 AJAX 호출이있는 경우

public function main(Request $request) 
{ 
    $data = [ 
     'categories' => /* ... */ 
    ]; 

    if ($request->input('format') === 'json') { 
     return response()->json(data); 
    } 

    return view('main', $data); 
} 

가 또는 당신은 단순히 확인할 수 있습니다을 것 이를 위해 Middleware을 사용하십시오. 아래 예에서는 항상 view('...', [/* some data */])을 반환한다고 가정합니다.

다음은 형식이 json이어야하는지 확인한 후 응답에서보기에 붙여 넣은 데이터를 가져 와서 대신 반환합니다. 그런 다음 jsonhtml을 반환 할 수있는 경로에이 미들웨어를 적용하면됩니다.

public function handle($request, Closure $next) 
{ 
    $response = $next($request); 

    if ($request->input('format') == 'json') { 

     $response->setContent(
      $this->getDataFromResponse($response) 
     ); 

    } 

    return $response; 
} 

/** 
* Get the data that was pasted to the view 
* 
* @param \Illuminate\Http\Response $response 
*/ 
protected function getDataFromResponse($response) 
{ 
    $content = $response->getOriginalContent(); 

    return $content->getData(); 
} 

희망이 있습니다.