web-dev-qa-db-ja.com

カスタム500エラーページ:致命的なエラーのテーマを設定する方法はありますか?

/core/includes/errors.incで、致命的なエラーが発生すると、「Webサイトで予期しないエラーが発生しました。しばらくしてからもう一度お試しください。」というメッセージが返されます。 error_levelがverboseに設定されている場合はバックトレース、それ以外の場合はバックトレースなし。

この時点では、イベントサブスクライバーが応答をキャプチャして変更する方法はないようです。

あれは正しいですか?

または、errors.incの268行目の出力をDrupal 8.4でマークアップでラップする方法はありますか?

注:別の 致命的なエラーではない場合に機能する答え がありますが、これは完全なソリューションを提供しません。

また、.htaccessとApache ErrorDocumentディレクティブを調べましたが、それは 誤解されていました です。 ApacheがPHPに渡されると、そのディレクティブは使用できなくなります。これはrealサーバーエラーの場合です。

6
oknate

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 }
_
3