2016-05-26 7 views
0

Я делаю приложение в Silex.Catch custom Exception в Silex не работает должным образом

Где-то в моем коде я throw new OrderNotFoundException($message, 404);

Так $app->error в моем index.php поймает это. Я реализовал это, как следует:

$app->error(function (\Exception $e, $code) use ($app) { 
    $messages = [ ]; 

    switch ($code) { 
     case 401: 
      $messages[ 'message' ] = 'unauthorized'; 
      break; 
     case 404: 
      if($e instanceof OrderNotFoundException){ 
       $messages[ 'message' ] = 'no_order_found'; 
      } else { 
       $messages[ 'message' ] = 'page_not_found'; 
      } 
      break; 
     case 409: 
      if($e instanceof MultipleOrderException){ 
       $messages[ 'message' ] = 'multiple_orders'; 
      } 
      break; 
     default: 
      $messages[ 'message' ] = 'unknown_error'; 
    } 

    return $app[ 'twig' ]->render('home.twig', $messages); 
}); 

Но я продолжаю получать 'unknown_error'.
Является ли $code, который я выбрал с моим исключением, правильно или должен ли я сделать это другим способом?

Создание новой функции ошибок для всех Исключений, кажется, не так хорошо, как я думаю.

ответ

1

OrderNotFoundException должны осуществлять HttpExceptionInterface. В этом случае вы можете продлить NotFoundHttpException:

use Symfony\Component\HttpKernel\NotFoundHttpException; 

class OrderNotFoundException extends NotFoundHttpException {} 

и просто выбросить исключение с

throw new OrderNotFoundException($message); 
+0

А как насчет моего 'MultipleOrderException'? Я теперь бросаю его как 'throw new OrderNotFoundException ($ message, 409);' поэтому я думаю, что должен делать 'class MultipleOrderExceptionextends ConflictHttpException {}' чем? – MichaelDeBoey

+0

'OrderNotFoundException' подразумевает, что исключение предназначено только для кода 404. (Не обнаружена). Если вы хотите использовать другой статус http, тогда назовите его 'OrderException' и расширьте общий класс [HttpException] (https://github.com/symfony/http-kernel/blob/master/Exception/HttpException.php) или добавьте новый особый класс исключения для тех http status – Federkun

+0

ОК, это более понятно, теперь спасибо :-) Я возьму ваш и @ DarkBee ответ на вопрос :-) – MichaelDeBoey

1

Имхо вы бы лучше сделать это как это:

$app->error(function (OrderNotFoundException $e, $code) use ($app) { 

}); 


$app->error(function (MultipleOrderException $e, $code) use ($app) { 

}); 

//... 

$app->error(function (Exception $e, $code) use ($app) { 


}); 
+0

Это именно то, что я не думаю, что это хорошая идея. потому что вы почти одинаковы в каждой функции ошибок '$ messages ['message'] = 'no_order_found'; return $ app ['twig'] -> render ('home.twig', $ messages); ' – MichaelDeBoey

+0

' function createMessage ($ type) use ($ app) { return $ app-> render ('template.twig' , ['type' => $ type,]); } 'для предотвращения дублирования кода – DarkBee

+0

Это не помогает, поэтому мне всегда нужно сказать' $ type = 'no_order_found'; createMessage ($ type); 'в каждой функции Error. Это то же количество _duplication_, и это то, что я не знаю в моем случае коммутатора – MichaelDeBoey

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

  • Нет связанных вопросов^_^