2017-06-02 3 views
1

Für jede Route in meinem dünnen 3 API habe ich etwas wie folgt aus:Schlanke Rahmen gemeinsamen Exception-Handler

$app->get('/login', function(Request $request, Response $response) 
{ 
    try 
    { 
    # SOME MAGIC HERE 
    # ... 
    } 
    catch(\My\ExpectedParamException $e) 
    { 
    $response->withStatus(400); # bad request 
    } 
    catch(\My\ExpectedResultException $e) 
    { 
    $response->withStatus(401); # unauthorized 
    } 
    catch(Exception $e) 
    { 
    $this->logger->write($e->getMessage()); 
    throw $e; 
    } 
}); 

ich nur einmal dieses Muster schreiben würde, Code-Redundanz so weit wie möglich zu vermeiden. Grundsätzlich sollte meine Routen-Definition auf #SOME MAGIC HIER beschränkt sein. Bietet Slim eine Möglichkeit, Fehler in nur einem Teil des Codes zu erkennen?

Antwort

1

Ja, Sie können alle Szenarien an einem Ort behandeln. Sie einfach Ihre eigene Fehlerbehandlung definieren und an DI-Container übergeben:

$container = new \Slim\Container(); 
$container['errorHandler'] = function ($container) { 
    return function ($request, $response, $exception) use ($container) { 
     if ($exception instanceof \My\ExpectedParamException) { 
      return $container['response']->withStatus(400); # bad request 
     } elseif ($exception instanceof \My\ExpectedResultException) { 
      return $container['response']->withStatus(400); # unauthorized 
     } 
     return $container['response']->withStatus(500) 
          ->withHeader('Content-Type', 'text/html') 
          ->write('Something went wrong!'); 
    }; 
}; 
$app = new \Slim\App($container); 

einen Blick auf corresponding part of the framework documentation haben.

+0

Ich habe diesen Teil der Dokumentation komplett vergessen;) –