Laravel 7.1にアップグレードしましたが、Symfony 5ではこれらのクラスは存在しなくなりました:
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\Debug\ExceptionHandler as SymfonyExceptionHandler;
私はapp\Exceptions\Handler.phpファイルでそれらを使用して、例外が再度スローされたときに電子メール通知を送信し、Laravel 6でうまく機能しましたが、6.xから7.1にアップグレードすると壊れました。 2もSymfony 5にアップグレードしました。
前述のクラスを次のクラスに置き換えました。
use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer;
use Symfony\Component\ErrorHandler\Exception\FlattenException;
そしてこれを置き換えました:
$e = FlattenException::create($exception);
$handler = new SymfonyExceptionHandler();
$html = $handler->getHtml($e);
これとともに:
$e = FlattenException::create($exception);
$handler = new HtmlErrorRenderer();
$content = $handler->getBody($e);
これは機能しますが、以前のようにデバッグコンテンツを電子メールで受け取る代わりに、一般向けのより基本的なエラーメッセージを受け取ります。
さまざまな形式の例をここで確認できます: https://symfony.com/doc/current/controller/error_pages.html
私が見逃している単純なものがあると確信していますが、アップグレード前に取得していたような詳細な例外データを送信する方法はまだわかりません。
助言がありますか?
完全な応答をHTMLとして取得するには、次を使用します。
$html = ExceptionHandler::convertExceptionToResponse($e);
これが完全なHandler.phpコードです
<?php
namespace App\Exceptions;
use Log;
use Mail;
use Exception;
use Throwable;
use App\Mail\ErrorNotification;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that should not be reported.
*
* @var array
*/
protected $dontReport = [
HttpException::class,
ModelNotFoundException::class,
];
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $e
* @return void
*/
public function report(Throwable $e)
{
if ($this->shouldReport($e)) {
$this->sendEmail($e);
}
return parent::report($e);
}
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Throwable $e)
{
if ($e instanceof ModelNotFoundException) {
$e = new NotFoundHttpException($e->getMessage(), $e);
}
return parent::render($request, $e);
}
public function sendEmail(Throwable $e)
{
try {
$html = ExceptionHandler::convertExceptionToResponse($e);
Mail::to('[email protected]')->send(new ErrorNotification($html));
} catch (Exception $ex) {
Log::error($ex);
}
}
}