/core/includes/errors.incで、致命的なエラーが発生すると、「Webサイトで予期しないエラーが発生しました。しばらくしてからもう一度お試しください。」というメッセージが返されます。 error_levelがverboseに設定されている場合はバックトレース、それ以外の場合はバックトレースなし。
この時点では、イベントサブスクライバーが応答をキャプチャして変更する方法はないようです。
あれは正しいですか?
または、errors.incの268行目の出力をDrupal 8.4でマークアップでラップする方法はありますか?
注:別の 致命的なエラーではない場合に機能する答え がありますが、これは完全なソリューションを提供しません。
また、.htaccessとApache ErrorDocumentディレクティブを調べましたが、それは 誤解されていました です。 ApacheがPHPに渡されると、そのディレクティブは使用できなくなります。これはrealサーバーエラーの場合です。
SymfonyのHttpKernelはイベントディスパッチャーを使用して、サブスクライバーが例外を処理し、カスタム応答を送信できるようにします。サブスクライバーがそうしない場合にのみ、例外がさらにスローされ、グローバルエラーハンドラーに到達します。 (その時点で実際に他のことを行うには遅すぎます。)
Drupalには、HTTP例外用のサブスクライバー(または特定の条件をチェックする複数のサブスクライバー)が既に付属しています(これらは、NotFoundHttpException
などの_\Symfony\Component\HttpKernel\Exception\HttpExceptionInterface
_のインプリメンターです)。
non-HTTP例外が発生した場所で絶対にインターセプトしてカスタム応答を返す必要がある場合は、独自のサブスクライバー(_Drupal\Core\EventSubscriber\HttpExceptionSubscriberBase
_を参照)を作成し、非常に低い優先度(< -128)コアHTTP例外サブスクライバーとの干渉を回避します。
ただし、アーキテクチャ的には、これは良い方法ではないことをお勧めします。特定の例外をトリガーするコントローラーがある場合は、それをキャッチして適切なHTTP例外をスローする必要があります。また、イベントサブスクライバーをいじるよりもはるかに少ないコードで済みます。 ;)
必要に応じて、ServiceUnavailableHttpException(503)をスローしたり、クラスがない場合はnew HttpException(500)
などのカスタムステータスを設定したりすることもできます。
Drupalコアの例外サブスクライバーは実際には5xxエラーを処理しませんが、処理する独自のエラーを作成できます。これは、おそらく次のようになります。
_class Custom5xxHtmlSubscriber extends HttpExceptionSubscriberBase {
public function on5xx(GetResponseForExceptionEvent $event) {
// Do stuff
(new Response())->send();
}
_
次のような対応するサービス定義を使用します。
_ custom5xxsubscriber:
class: ...
tags:
- { name: event_subscriber }
_