2017-04-12 4 views
0

Ich habe eine Slim 3 Route: $app->get('/calendar/{date}', 'CalendarCtrl:getSchedule');
Diese Route kann den gleichen Zeitplan durch einfache HTML-Liste, JSON oder XML-Format zurückgeben.
Jetzt suche ich nach einer einfachen REST-Lösung basierend auf Accept (oder mehr Header) HTTP-Header.Header-basierte Routing mit Slim 3

Zum Beispiel:
Anfrage:

GET /calendar/2017-01-01 
Accept: application/json 

Antwort:

Content-Type: application/json 
Body: {json schedule} 

So eine Route smth so sein sollte: $app->get('/calendar/{date}', {Accept: application/json}, 'CalendarCtrl:getScheduleJson');

Ich weiß, dass ich für diesen Header überprüfen in ein Routen-Handler. Aber ich suche nach einer einfachen deklarativen Lösung.

Antwort

1

eine Middleware hinzufügen für diesen Header zu überprüfen, bevor die Antwort von Ihrem API

$app->add(function ($req, $res, $next) { 
//Checking for $req content-type here then send the response with the same one 
//example 
$headerValue= $req->getHeader('Accept'); 
if($headerValue=='application/json') 
{ 
    $response = $next($req, $res); 
    return $response 
      ->withHeader('Content-type', 'application/json'); 
} 
else{ 

//check for other header here 
}  
}); 
+0

Danke für die Middleware-Idee zu senden. Es ist ein neues Konzept für mich, können Sie mir bitte beraten, welche Best Practices mit Middlewares in Slim sind? Sie haben eine anonyme Funktion verwendet, Slim-Dokumente verwenden eine aufrufbare Klasse, andere Handbücher erweitern SlimMiddleware (Slim 2). Was verwendest du als Best Practice in Middleware? Danke – Doc999tor

+0

Noch eine Frage: in einem Fall von Accept: text/html Header muss ich eine HTML Seite mit Twig Template Rendering erstellen. Es ist ein wenig, aber komplizierter als einfach 'return $ response-> withHeader ('Content-type', 'application/json');' Die Frage ist: sollte ein solches Stück Logik in einer Middleware sein? Vielleicht ist der Controller der richtige Ort? Wenn ja, gehe ich zurück zur vorherigen Frage: Middlewares lösen das Problem mit dem headerbasierten Routing nicht. Es ist überhaupt kein Routing. – Doc999tor

+0

Middleware in Slim ist einfach zu variieren, Sie werden eine Schicht um Ihre API überprüfen, bevor Sie die Anfrage an die API übergeben und etwas in der Antwort vor dem Senden an den Client hinzufügen –