2015-12-16 25 views
9

私は、モバイルアプリ向けに公開される一連の残りのAPIを開発しています。私はLaravelプロジェクトの開発のためのリポジトリパターンに従っています。すべてのAPIのセット全体で一定のJSON出力をフォーマットするためのプレゼンターとトランスフォーマーを実装するにはどうすればよいですか?私は、ログインLaravel + Dingoの一貫したREST APIレスポンス

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() 
       ]); 
      } 
    } 

については、以下のコントローラは、今、変圧器およびプレゼンターは、画像に入って来るんいるたとえば

?両方とも、dbオブジェクトを変換して出力をフォーマットし、書式設定されたJSONを生成してAPI間で統一されたままにするために使用されていることはわかっています。

ディンゴAPIとフラクタル、さらにはフレームワーク(L5 repository)は詳細なドキュメントを提供していないため、これに関するチュートリアルは見つかりません。

私は製品

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 
     ]; 
    } 
} 

プレゼンター

私はコントローラでプレゼンターを設定し、戻って応答する方法
<?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(); 
    } 
} 

のリストを与える APIについて次のプレゼンターと変圧器を作成しました?試しました

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

しかし、それは動作していないようだし、ドキュメントは完全な手順を示していません。

  1. 上記の例では、API全体で使用できるエラーレスポンスのテンプレートを作成する方法とエラー例外をどのように渡すのですか?
  2. データベースオブジェクトを表現可能なJSONに変換するのにプレゼンターとトランスフォーマーを使用できますが、それ以外のものはありません。そうですか?
  3. 成功応答とエラー応答にはどのようにプレゼンターとトランスフォーマーを使用しますか?例外をDBオブジェクトの代わりにトランスフォーマに渡すことによって?

答えて

0

フラクタルは完全にここに文書化されている:http://fractal.thephpleague.com/ は、私は定期的にあなたがgithubのhttps://github.com/philsturgeon/build-apis-you-wont-hateで利用可能な図書コードのほとんどを見つけることができますhttps://leanpub.com/build-apis-you-wont-hateフィルチョウザメから読み取る優秀な本があります。そこにフラクタルの本当に素晴らしい例があります。

  1. 私はそのよう
  2. Tranformersは、一貫性のあるJSON形式でオブジェクトを変換しているアピコントローラを作成し、すべての応答機能(respondWithError、respondWithArrayなど)があるはずですが、私のControllers.Inからそれを延長しますすべてのエンドポイントが各エンティティに対して同じことを返します。

  3. いけない、本当にフラクタルドキュメントの十分な例があります。この

  4. に答えを持っています。
1

私はまったく同じ問題を抱えていたし、ここで私は、変圧器

コントローラとのディンゴを使用する方法である:

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()); 
} 

トランスフォーマー:

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

、これは私がエラーを処理する方法であります:

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

私はちょうどここでも同様の質問をしています。他の質問については、https://stackoverflow.com/a/34430595/429719に私の答えを見てください。

私はあなたがDingoを使用しているので、構造化レスポンスクラスとして使用しています。あなたは、コントローラは、Dingoから延び、その後、あなただけのように構造化された方法でアイテムやコレクションを返すことができていることを確認します:

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

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

あなたがここにドキュメントのための外観を扱う素敵な誤りをしたい場合:https://github.com/dingo/api/wiki/Errors-And-Error-Responses

基本的には、コア例外をいくつか、またはいくつかのカスタムDingoを投げることができます。 Dingoレイヤーはそれらを捕捉し、構造化JSONレスポンスを返します。ディンゴのドキュメントを1として :

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

が生成されます:

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

リターンの$ this - >対応 - >アイテム($ユーザー、新しいUserTransformer)。実際に私の反応を変えているわけではありません。そこにエラーや何も表示されていません。私はちょうど変換なしでプレーンjsonを取得しています。 – Ajeesh

関連する問題