2015-02-24 5 views
4

Я строю API RESTful с Laravel. Мой API всегда возвращает JSON. То, что я хотел бы сделать, - поддерживать логику ответа в одном месте. Вот как я делаю это прямо сейчас в контроллере API, на который указывает Route::controller(). Смешной и ультра-полезный пример подходит:Ответ RESTful API в Laravel 5

public function getDouble($number) { 
    try { 
     if (!is_numeric($number)) { 
      throw new HttpException(400, 'Invalid number.'); 
     } 

     $response = $number * 2; 
     $status = 200; 
    } 
    catch (HttpException $exception) { 
     $response = $exception->getMessage(); 
     $status = $exception->getStatusCode(); 
    } 

    return response()->json($response, $status); 
} 

В этом примере, мой API маршрут будет, например /double/13 доступом методом GET. Проблема в том, что я повторяю эту попытку ... catch block в каждом методе. Я бы хотел, чтобы мои методы API были такими:

public function getDouble($number) { 
    if (!is_numeric($number)) { 
     throw new HttpException(400, 'Invalid number.'); 
    } 

    return $number; 
} 

А затем поймайте эти исключения и сформируйте JSON в другом месте. Каков наилучший подход с точки зрения хорошей архитектуры приложения?

ответ

12

Ответ на Exception

Вы можете сделать это путем обработки исключений в App\Exceptions\Handler.

Вы можете сделать это в методе визуализации, likeso:

/** 
* Render an exception into an HTTP response. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Exception $e 
* @return \Illuminate\Http\Response 
*/ 
public function render($request, Exception $e) 
{ 
    if($e instanceof HttpException) { 
     return response()->json($e->getMessage(), $e->getStatusCode()); 
    } 

    return parent::render($request, $e); 
} 

успеха Ответ

Есть несколько способов сделать это, но я думаю, Middleware будет лучше всего подходит один правый.

  • Создать промежуточное программное обеспечение (скажем, ApiResponseFormatterMiddleware)
  • В вашем 'App \ Http \ Kernel', добавьте его в $routeMiddleware массив.
  • Примените его к маршрутам api, ответ на который вы хотите разбор.

Вы могли бы сделать что-то в строках:

/** 
* Handle an incoming request. 
* 
* @param \Illuminate\Http\Request $request 
* @param \Closure $next 
* @return mixed 
*/ 
public function handle($request, Closure $next) 
{ 
    $response = $next($request); 

    return response()->json($response->getOriginalContent()); 
} 

Ofcourse, вам нужно немного изменить логику, чтобы разобрать содержимое так, как вы хотите, но скелет остается тем же самым.

+0

My $ response - простая строка, это неправильно? –

+0

'$ response', когда casted to string будет давать отображаемую строку. Его предполагаемое поведение. – ultimate

+0

Да, но я ответил 'var_dump' на $ response в моем промежуточном программном обеспечении, и он говорит, что это строка, а не объект. –

Смежные вопросы