2017-01-30 2 views
0

Я использую ZendFramework 3 в проекте REST API. Таким образом, существует несколько модулей и плагин, который проверяет статус авторизации. Если авторизация не удалась, она выдает исключение.Как перехватить исключения в ZendFramework 3

Невозможно обработать его в каждом контроллере отдельно, используя try .. catch. Как я могу перехватить и обработать Exception и сгенерировать JSON-выход, как это?

{ 
    message: "Access denied", 
    reason: "Your token is incorrect" 
} 

Я новичок в ZendFramework, поэтому я понятия не имею, как это сделать. И официальная документация не сказала ни слова об этом.

ответ

1

Есть default framework Events, которые активируются, включая событие MvcEvent :: EVENT_DISPATCH_ERROR. Итак, все, что вам нужно сделать, - это подключить слушателя к этому событию ошибки и вернуть ответ JSON.

Во-первых, вам нужно зарегистрировать прослушиватель в module.config.php

// In my case module name is Api 
'listeners'   => [ 
    Api\Listener\ApiListener::class // Register the class listener 
], 
'service_manager' => [ 
    'invokables' => [ 
     // Register the class (of course you can use Factory) 
     Api\Listener\ApiListener::class => Api\Listener\ApiListener::class 
    ], 
], 

Во-вторых, создать класс файл Api/Слушатель/ApiListener.php

<?php 

namespace Api\Listener; 

use Zend\EventManager\AbstractListenerAggregate; 
use Zend\EventManager\EventManagerInterface; 
use Zend\Mvc\MvcEvent; 
use Zend\Console\Request as ConsoleRequest; 
use Zend\View\Model\JsonModel; 


class ApiListener extends AbstractListenerAggregate 
{ 

    public function attach(EventManagerInterface $events, $priority = 1) 
    { 
     // Registr the method which will be triggered on error 
     $this->listeners[] = $events->attach(MvcEvent::EVENT_DISPATCH_ERROR, 
     [$this, 'handleError'], 0); 
    } 


    /** 
    * Return JSON error on API URI(s) 
    */ 
    public function handleError(MvcEvent $e) 
    { 
     $request = $e->getParam('application')->getRequest(); 

     if($request instanceof ConsoleRequest){ 
      return; 
     } 

     //If you want to convert Response only on some URIs 
     //$uri = $request->getUri()->getPath(); 
     //if(0 !== strpos($uri, '/api')){ 
     // return; 
     //} 

     $response = $e->getResponse(); 
     $exception = $e->getResult()->exception; 
     $errorType = $e->getError(); 
     $errorCode = $exception && $exception->getCode() ? $exception->getCode() : 500; 
     $errorMsg = $exception ? $exception->getMessage() : $errorType; 
     $json  = new JsonModel(['message' => $errorMsg]); 

     $json->setTerminal(true); 
     $response->setStatusCode($errorCode); 
     $e->setResult($json); 
     $e->setViewModel($json); 
    } 

} 

Это все. Теперь при каждой ошибке будут выполнены ваши пользовательские логики.

Смежные вопросы