2017-01-30 1 views
0

私はREST APIプロジェクトでZendFramework 3を使用しています。したがって、認証ステータスをチェックするプラグインとモジュールはほとんどありません。認可が失敗した場合、例外がスローされます。ZendFramework 3の例外をインターセプトする方法

try .. catchを使用して各コントローラで個別に処理する方法はありません。インターセプトして例外を処理し、このようなJSON出力を生成するにはどうすればよいですか?

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

私はZendFrameworkの初心者ですから、どうやってこれを行うのか分かりません。そして公式の文書はこれについての言葉を言っていない。

答えて

1

イベントMvcEvent :: EVENT_DISPATCH_ERRORを含むトリガーされたdefault framework Eventsがあります。したがって、そのエラーイベントにリスナーをアタッチして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); 
    } 

} 

を作成する必要があります。すべてのエラーが発生すると、カスタムロジックが実行されます。

関連する問題