2016-05-26 7 views
0

私はSilexでアプリケーションを作成しています。私はthrow new OrderNotFoundException($message, 404);Silexのカスタム例外を予想どおりに実行していません

を行う私のコードで

どこかだから私のindex.php$app->errorはこれをキャッチします。 私は以下のようにこれを実装しました:

$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

OrderNotFoundExceptionHttpExceptionInterfaceを実装する必要があります。

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ステータスのための新しい特定の例外クラス – Federkun

+0

OK今よりもっと明確です:-)あなたと@ 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

と例外をスロー:この場合、あなたはNotFoundHttpExceptionを拡張することができます。それで、あなたはすべてのエラー関数にほとんど同じものを持っているからです。 $ messages ['message'] = 'no_order_found'; return $ app-> render( 'template.twig');戻り値$ app ['twig'] - >レンダリング( 'home.twig'、$ messages); ' – MichaelDeBoey

+0

'function createMessage($ type)use($ app){ return $ app-> render 、['type' => $ type、]); } '重複するコードを防ぐために – DarkBee

+0

それは役に立たないので、私はいつも' $ type = 'no_order_found'と言う必要があります。すべてのError-functionでcreateMessage($ type);を呼び出します。それは同じ量の_複製であり、それは私がスイッチの事例で知らないものです – MichaelDeBoey

関連する問題