Laravel 5 包异常未触发 Hander 的渲染方法

Laravel 5 package exceptions not firing Hander's render method

我正在开发一个包并将 Orchestra/Testbench 包用于我的单元测试。

我正在尝试编写一个 PHPUnit 测试来验证抛出异常时响应是否正确。在我的存储库中,我抛出以下异常:

use Acme\Common\Exceptions\ValidationException;
...
throw new ValidationException($validator);

我已经在包裹的服务提供商中注册了处理程序 class:

$this->app->singleton('Illuminate\Contracts\Debug\ExceptionHandler', 'Acme\Common\Exceptions\Handler');

但是 Handler class 中的 render() 方法没有被触发。这是 render() 方法:

public function render($request, Exception $e)
{
    if ($e instanceof \Acme\Common\Exceptions\ValidationException) {

        $message = implode(' ', array_flatten($exception->getMessages()->toArray()));

        $response = array('errorCode' => $exception->getCode());

        return \Response::make($response, 400);
    }

    return parent::render($request, $e);
}

相反,我只得到通用异常方法:

Acme\Common\Exceptions\ValidationException: {"key":["The key field is required."]}

我什至在 render() 方法的开头放了一个 dd() 但什么也没有。我是否遗漏了 Orchestra Testbench 的某种设置?

您是否偶然覆盖了此 class 中的构造函数?我遇到了完全相同的问题(也试图捕获 ValidationException),但我没有意识到我搞砸了构造函数。可能发生的事情是某些事情导致发生未被捕获的异常(因为它发生在您的异常处理程序中!)。在我的例子中,我覆盖了构造函数,这意味着父 class 没有得到 Log class 注入,这导致在 render 方法被触发之前抛出异常并停止。

您通过变量“$e”注入了 Exception-class,但在您的方法中调用了一个变量“$exception”。

由于未设置 $exception-变量,您应该使用 $e-变量。

public function render($request, Exception $e)
{
    if ($e instanceof \Acme\Common\Exceptions\ValidationException) {

        $message = implode(' ', array_flatten($e->getMessages()->toArray()));

        $response = array('errorCode' => $e->getCode());

        return \Response::make($response, 400);

    }

    return parent::render($request, $e);
}