web-dev-qa-db-ja.com

Laravel Symfony 5のアップデート後に7つのメール例外が壊れました

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

私が見逃している単純なものがあると確信していますが、アップグレード前に取得していたような詳細な例外データを送信する方法はまだわかりません。

助言がありますか?

4
climbd

完全な応答を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);
        }
    }

}
0
Muaz Malas