2016-07-25 3 views
2

Я работаю над проектом с Laravel, исключения становятся пойманными в Exceptions\Handler.php внутри функции рендеринга, как так:Laravel исключение обработчик

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

Проблема, как вы можете видеть, что это становится уродливым и грязным код много случаев

Как это исправить?

+0

Удалено то, что расплывчато или в основном основано на мнениях (например, ** наилучшая ** практика) –

ответ

0

Хорошо, нашел способ сделать его лучше. Если кто-то хотел бы улучшить его исключения обработчика в Laravel следить за этим:

Под приложение/провайдеры создать новый сервис-провайдера, позволяет называть его 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.php в функции визуализации:

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 

Надеюсь, вы найдете это полезным, как я.

0

Если ваши пользовательские исключения расширяют общий интерфейс, вы можете просто проверить этот интерфейс, а затем вызвать метод контракта.

if ($e instanceof CustomExceptionInterface) { 
    return $e->contractMethod(); 
} 
Смежные вопросы