1

重い AJAX Symfony 2 アプリを開発しています。私の行動のほとんどは、次のように始まります。

if($this->getRequest()->isXmlHttpRequest()) {
   // Do something
}

アクションは、AJAX 要求に応答する場合にのみ実行する必要があります。シンプルさとより良いインデントのために、このようにする方が良いと思いました:

if(false === $this->getRequest()->isXmlHttpRequest()) {
   // throw some exception
}

// Do something

私の問題は、スローできる最も適切な例外が何であるかがわからないことです。この件に関して何らかのフィードバックを得たいと思います。多分AccessDeniedException?Symfony の事前定義された例外のいずれかが適合しますか? または、ベースの PHP Exception クラスを拡張する新しい Exception を作成する必要がありますか? どんな意見でも本当に感謝し、私の英語で申し訳ありません.


編集:これはどうですか?

https://github.com/symfony/HttpKernel/blob/master/Exception/BadRequestHttpException.php

4

1 に答える 1

3

認証については言及していないので、ここでは問題ないと思います。その場合、ユーザーの資格情報が正しくないか見つからないことを意味するエラーAccessDeniedExceptionが発生するため、401 Unauthorizedは使用しません。401 Unauthorizedステータスの定義は次のとおりです。

リクエストにはユーザー認証が必要です。応答には、要求されたリソースに適用可能なチャレンジを含む WWW-Authenticate ヘッダー フィールド (セクション 14.47) を含める必要があります。クライアントは、適切な Authorization ヘッダー フィールド (セクション 14.8) を使用してリクエストを繰り返すことができます。リクエストに承認資格情報がすでに含まれている場合、401 応答は、それらの資格情報に対する承認が拒否されたことを示します。401 応答に前の応答と同じチャレンジが含まれており、ユーザー エージェントが少なくとも 1 回認証を試みている場合、応答で指定されたエンティティをユーザーに提示する必要があります。そのエンティティには関連する診断情報が含まれている可能性があるためです。HTTP アクセス認証については、「HTTP 認証: 基本およびダイジェスト アクセス認証」[43] で説明されています。

私も一緒に行きませんBadRequestHttpException400これは、サーバーが要求を理解できなかったことを意味する応答を返します。この場合、サーバーはリクエストを理解していますが、それを拒否していると思います。400応答の完全な定義は次のとおりです。

構文が正しくないため、サーバーは要求を理解できませんでした。クライアントは、変更なしでリクエストを繰り返すべきではありません。

ここであなたのケースに最も近いHTTPステータスは次のとおりだと思います403 Forbidden

サーバーは要求を理解しましたが、要求を満たすことを拒否しています。承認は役に立たず、要求を繰り返すべきではありません。リクエスト メソッドが HEAD ではなく、サーバーがリクエストが実行されなかった理由を公開したい場合、拒否の理由をエンティティに記述する必要があります。サーバーがこの情報をクライアントに提供したくない場合は、代わりにステータス コード 404 (Not Found) を使用できます。

githubのSymfony によると、Symfony には 、または類似のものがあるようには見えませんForbiddenException...これは少し奇妙だと思います (何か足りないのでしょうか?)。

その場合は、 を実装してHttpExceptionInterface(または単に を拡張してHttpException)、独自のものを作成できます。それ、またはその場で一般的なものを作成することができます:

throw new HttpException(403, "Forbidden");
于 2013-01-03T19:48:48.753 に答える