2016-11-03 3 views
1

Я использую Laravel 5.3. У меня мало API, где пользователь запрашивает определенный идентификатор. Для примера URL, чтобы подписаться событие
example.com/api/event/{id}/subscribeLaravel 5 - глобальный обработчик исключений для API, запрашивающий несуществующий объект

Обычно, если id не существует, Laravel будет возвращать отклик 500 с сообщением об ошибке «Попытка получить свойство не-объект»

Так что я хотел бы добавить проверку, если событие будет существовать, как показано ниже в каждом контроллере, где модель «идентификатор» идентификатор передается:

$event = Event::find($id) 
if ($event) { 
    // return json data 
} 
else { 
    return response()->json([ 
     'status' => 'object not found' 
    ], 404); 
} 

Мой вопрос, лучше решение справиться с этим во всем мире, чтобы проверить, если запрашиваемый объект не существует? Мое текущее решение здесь, но я могу подумать, что должен быть лучше один

Я добавляю этот код в свой app/Exception/Handler.php, так что каждый ави запрос несуществующий объект вернет 404 с конкретным сообщением json. Таким образом, потребитель API будет знать, что идентификатор объекта недействителен.

public function render($request, Exception $exception) 
{ 
    // global exception handler if api request for non existing object id 
    if ($request->wantsJson() && $exception->getMessage() == 'Trying to get property of non-object') { 
     return response()->json([ 
      'status' => 'object requested not found' 
     ], 404); 
    } 

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

Заранее благодарен!

ответ

4

Вы можете использовать render() функция App\Exceptions\Handler класса как:

public function render($request, Exception $exception) 
{ 
    if ($request->wantsJson() && $exception instanceof ModelNotFoundException) { 
     return response()->json(['status' => 'object requested not found'], 404); 
    } 

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

И помните, чтобы добавить следующий код:

use Illuminate\Database\Eloquent\ModelNotFoundException; 

Docs

+0

'use Illuminate \ Database \ Eloquent \ ModelNotFoundException;' трюк. Благодарю. также я немного поменяю ваш код на использование 'хочетJson()' – xmhafiz

2

Попробуйте изменить

$event = Event::find($id) 

в

$event = Event::findOrFail($id) 

Насколько я помню, он будет бросать ModelNotFoundException, если он не может найти что-нибудь для этого идентификатора. Перейдите к app/Exceptions/Handler.php и внутри метода визуализации, поймайте исключение и обработайте его.

Отредактировано:

if ($e instanceof HttpResponseException) { 
      return $e->getResponse(); 
     } elseif ($e instanceof ModelNotFoundException) { 
      $e = new NotFoundHttpException($e->getMessage(), $e); 
     } elseif ($e instanceof AuthenticationException) { 
      return $this->unauthenticated($request, $e); 
     } elseif ($e instanceof AuthorizationException) { 
      $e = new HttpException(403, $e->getMessage()); 
     } elseif ($e instanceof ValidationException && $e->getResponse()) { 
      return $e->getResponse(); 
     } 

Вы можете видеть, что родительский метод визуализации запускает NotFoundHttpException, если он получает ModelNotFoundException исключение. Я думаю, вы можете переписать его в соответствии с вашими требованиями.

+0

'findOrFail' это хорошо, но это возвращение NotFoundHttpException и я может проверить его при использовании вашего условия выше, а также когда я не могу проверить с помощью 'if ($ e instanceof NotFoundHttpException)'. Спасибо – xmhafiz

+0

@ h44f33z 'findOrFail' фактически возвращает' ModelNotFoundException', но родительский метод визуализации запускает «NotFoundHttpException». Вы можете изменить это, чтобы соответствовать требованиям. – shoieb0101

+0

Я вижу, но 'if ($ e instanceof ModelNotFoundException)' также не соответствует. – xmhafiz

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