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);
}
我正在开发一个包并将 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);
}