2015-12-16 5 views
9

Ich habe eine Reihe von Rest-APIs entwickelt, die für mobile Apps verfügbar gemacht werden sollen. Ich befolge das Repository-Muster für die Entwicklung des Laravel-Projekts. Wie implementiere ich einen Presenter und einen Transformer für die Formatierung einer konstanten JSON-Ausgabe für alle meine APIs?Konsistente REST-API-Antwort in Laravel + Dingo

Zum Beispiel haben ich die folgenden Controller für die Anmeldung

public function authenticate() 
    { 
     $request = Request::all(); 
     try { 
       // If authenticated, issue JWT token 
       //Showing a dummy response 
       return $token; 
      } catch (ValidatorException $e) { 
       return Response::json([ 
        'error' =>true, 
        'message' =>$e->getMessageBag() 
       ]); 
      } 
    } 

Jetzt, wo ich einen Transformator und Moderator ins Bild kommen? Ich weiß, dass beide verwendet werden, um die Ausgabe zu formatieren, indem Sie das DB-Objekt konvertieren und ein formatiertes JSON erzeugen, damit es in meinen APIs einheitlich bleibt.

Die Dingo API und Fraktale oder sogar das Framework (L5 repository) bieten keine detaillierte Dokumentation und ich kann keine Tutorials zu diesem Thema finden.

ich habe folgende Moderator und Transformator für anderen API erstellt, die die Liste der Produkte

namespace App\Api\V1\Transformers; 

use App\Entities\Product; 
use League\Fractal\TransformerAbstract; 

class UserTransformer extends TransformerAbstract { 

    public function transform(\Product $product) 
    { 
     return [ 
      'id'  => (int) $product->products_id 
     ]; 
    } 
} 

Presenter

<?php 

namespace App\Api\V1\Presenters; 

use App\Api\V1\Transformers\ProductTransformer; 
use Prettus\Repository\Presenter\FractalPresenter; 

/** 
* Class ProductPresenter 
* 
* @package namespace App\Presenters; 
*/ 
class ProductPresenter extends FractalPresenter 
{ 
    /** 
    * Transformer 
    * 
    * @return \League\Fractal\TransformerAbstract 
    */ 
    public function getTransformer() 
    { 
     return new UserTransformer(); 
    } 
} 

Wie werde ich zurück stellen Sie den Moderator in der Steuerung und darauf zu reagieren gibt ? Versucht

$this->repository->setPresenter("App\\Presenter\\PostPresenter"); 

Aber es scheint nicht zu funktionieren und das Dokument zeigt nicht die vollständigen Schritte.

  1. Wie kann ich im obigen Beispiel eine Vorlage für eine Fehlerantwort erstellen, die ich in meinen APIs verwenden kann und wie werde ich meine Fehlerausnahmen an sie weitergeben?
  2. Es scheint wie presenter und Transformator kann verwendet werden, um die Datenbank Objekte in vorzeigbar JSON und nichts anderes zu konvertieren. Ist das richtig?
  3. Wie verwenden Sie einen Presenter und einen Transformator für eine Erfolgsantwort und eine Fehlerreaktion? Durch Übergabe von Ausnahmen anstelle von DB-Objekten an den Transformator?

Antwort

0

Fractal ist vollständig dokumentiert: http://fractal.thephpleague.com/ Es ist ein ausgezeichnetes Buch, das ich regelmäßig vom Phil Sturgeon lesen https://leanpub.com/build-apis-you-wont-hate Sie die meisten der Bücher Code in Github https://github.com/philsturgeon/build-apis-you-wont-hate finden. Sie können wirklich schöne Beispiele von Fractal dort finden.

  1. Ich würde eine Api-Controller erstellen und es von meinem Controllers.In verlängern sollte es alle Funktionen reagieren werden (respondWithError, respondWithArray etc.)
  2. Tranformers verwandeln Objekte in einem konsistenten json-Format, so dass Alle Ihre Endpunkte geben für jede Entität dasselbe zurück.

  3. Ich habe keine wirklich eine Antwort auf diese

  4. Es gibt genügend Beispiele in Fractal-Dokumentation.
1

hatte ich exakt das gleiche Problem und hier ist, wie ich Dingo mit Transformator verwendet

Controller:

public function update(Request $request) 
{ 

    $bus = new CommandBus([ 
     $this->commandHandlerMiddleware 
    ]); 

    $agency = $bus->handle(
     new UpdateAgencyCommand($request->user()->getId(), $request->route('id'), $request->only('name')) 
    ); 

    return $this->response->item($agency, new AgencyTransformer()); 
} 

Transformator:

class AgencyTransformer extends TransformerAbstract 
{ 
    public function transform(AgencyEntity $agencyEntity) 
    { 
     return [ 
      'id' => (int) $agencyEntity->getId(), 
      'name' => $agencyEntity->getName(), 
     ]; 
    } 
} 

und das ist, wie ich Fehler behandeln :

throw new UpdateResourceFailedException('Could not update agency.', $this->agencyUpdateValidator->errors()); 
1

Ich sehe gerade Ihre ähnliche Frage auch hier. So sehen Sie meine Antwort auf Ihre andere Frage hier: https://stackoverflow.com/a/34430595/429719.

Von der anderen Frage leitete ich ab, Sie verwenden Dingo, also verwenden Sie das als eine strukturierte Antwortklasse. Stellen Sie sicher, dass Sie Controller reicht von Dingo und dann können Sie nur Rückholeinzelteile und Sammlungen in strukturierter Art und Weise, wie:

return $this->response->item($user, new UserTransformer);

return $this->response->collection($users, new UserTransformer);

Wenn Sie einen schönen Fehlerbehandlung Look für die hier docs : https://github.com/dingo/api/wiki/Errors-And-Error-Responses

Grundsätzlich können Sie eine der Kernausnahmen oder einige benutzerdefinierte Dingo diejenigen werfen. Die Dingo-Ebene fängt sie ab und gibt eine strukturierte JSON-Antwort zurück. sich nach den docs Dingo:

throw new Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException('Nope, no entry today!');

generiert:

{ 
    "message": "Nope, no entry today!", 
    "status_code": 403 
} 
+0

return $ this-> response-> Artikel ($ user, neue UserTransformer); transformiert meine Antworten nicht wirklich. Es ist kein Fehler oder etwas darin gezeigt. Ich bekomme nur den einfachen JSON ohne irgendwelche Transformationen. – Ajeesh