Laravel异常处理程序

居住

我正在使用Laravel开发一个项目,Exceptions\Handler.php如下这样在render函数内部捕获了异常

public function render($request, Exception $e){
      switch(get_class($e)){
              case SOME_EXCEPTION::class:
                    do something..
              ...
              ...
              default:
                    do something..
     }

如您所见,在许多情况下,问题变得越来越丑陋和凌乱

如何解决这个问题?

居住

好的,找到一种使它看起来更好的方法。如果有人想在laravel中改进他的Exceptions处理程序,请遵循以下步骤:

在应用程序/提供程序下,创建新的服务提供程序,将其命名为ExceptionServiceProvider.php

    class ExceptionServiceProvider extends ServiceProvider {

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(ExceptionFactory::class);
    }

    public function boot(ExceptionFactory $factory){
        $factory->addException(UnauthorizedException::class, JsonResponse::HTTP_NOT_ACCEPTABLE);
        $factory->addException(ConditionException::class, JsonResponse::HTTP_NOT_ACCEPTABLE, "Some Fixed Error Message");

    }
}

在项目的某个地方创建ExceptionFactory包含addException()代码和消息方法和获取器的类

class ExceptionFactory{


private $exceptionsMap = [];
private $selectedException;

public function addException($exception, $code, $customMessage = null) {
    $this->exceptionsMap[$exception] = [$code, $customMessage];
}

public function getException($exception){
    if(isset($this->exceptionsMap[$exception])){
        return $this->exceptionsMap[$exception];
    }
    return null;
}

public function setException($exception){
    $this->selectedException = $exception;
}

public function getCode(){
    return $this->selectedException[0];
}

public function getCustomMessage(){
    return $this->selectedException[1];
}

}

然后,剩下要做的就是在Exceptions/handler.phprender函数中:

private $exceptionFactory;

    public function __construct(LoggerInterface $log, ExceptionFactory $exceptionFactory){
        parent::__construct($log);
        $this->exceptionFactory = $exceptionFactory;
    }

public function render($request, Exception $e){
        $error = new \stdClass();
        $customException = $this->exceptionFactory->getException(get_class($e));

        if(isset($customException)){
            $this->exceptionFactory->setException($customException);
            $error->code = $this->exceptionFactory->getCode();
            $error->message = $e->getMessage();
            $customMessage = $this->exceptionFactory->getCustomMessage();
            if(isset($customMessage)){
                $error->message = $customMessage;
            }
       }
       return new JsonResponse($error, $error->code);
 }
}

最后要记住的是将放在ServiceProvider应用程序设置下,config/app.php只需添加:

\App\Providers\ExceptionServiceProvider::class

希望您会像我一样找到有用的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Laravel异常处理程序中的错误

来自分类Dev

重定向Laravel的异常处理程序

来自分类Dev

如何在PHPUnit测试中覆盖Laravel的异常处理程序?

来自分类Dev

Laravel 5控制器异常处理程序

来自分类Dev

队列工作者的Laravel异常处理程序

来自分类Dev

异常处理程序中的Laravel Digital Ocean Error

来自分类Dev

Laravel - 在自定义处理程序中捕获异常

来自分类Dev

TAP全局异常处理程序

来自分类Dev

终止引发异常的处理程序

来自分类Dev

如何从处理程序引发异常

来自分类Dev

异常处理程序作为函数

来自分类Dev

终止引发异常的处理程序

来自分类Dev

全局异常处理程序WPF

来自分类Dev

如何从处理程序引发异常

来自分类Dev

覆盖处理程序中的异常

来自分类Dev

如何绕过Laravel异常处理

来自分类Dev

Laravel API类异常处理

来自分类Dev

子程序调用子程序的异常处理

来自分类Dev

使程序在异常处理程序(java)中崩溃

来自分类Dev

MySQL异常处理程序访问异常正在处理

来自分类Dev

单个异常处理程序可处理多个可能的异常

来自分类Dev

单个异常处理程序,可处理多个可能的异常

来自分类Dev

未处理的异常处理程序如何对异常调度进行更改?

来自分类Dev

通用Spring集成异常处理程序

来自分类Dev

JIT版本的异常处理程序实现

来自分类Dev

@ControllerAdvice异常处理程序方法未调用

来自分类Dev

Java未捕获的全局异常处理程序

来自分类Dev

使用全局异常处理程序与本地

来自分类Dev

全局错误处理程序的任何异常