私は、私たちが持っているいくつかのレガシーコードを新しいアーキテクチャパラダイムで開発し始めています。さまざまなパラダイムv1とv2を呼びましょう。あなたのオブジェクトとあなたの応答のためのモデル
v1では、エンティティの情報と属性のすべてを入れ子にしたさまざまなドメイン(ゲームなど)のモデルを用意していました。エンティティの内容と属性の組み合わせを何度も繰り返しました。したがって、エンドポイントにヒットしたときに、ドメインに関連するすべてをネストした応答を得ることができます。たとえば、/ v1 /ゲームでは、ゲーム+選手+チーム+アリーナが表示されます。
v2では、よりリソース指向になるようにしていますので、実際に照会しているリソースを取得できます。たとえば、v2 /ゲーム用のエンドポイントがあり、エンドポイントv2/games/{id}/players。前者ではゲームオブジェクトを取得し、次にゲームオブジェクトを取得します。私は、それはパスで自己ドキュメンタリーだと思う - あなたはあなたが行っている要求を見て取得するつもりだ知っている。
v1では、ドメインの「属性」として何が見えても、すべてが含まれたこの巨大なモデルがありました。実際のモデルには、関連する「属性」のオブジェクトが含まれます。たとえば、ゲームオブジェクトにはプレーヤーオブジェクト配列が含まれます。
実際に同じモデルを使用している場合は、GETに多くの情報(ネストされたオブジェクト)が表示され、POSTでは必要ないフィールドもあります(例:/あなたのポストで選手を送る - 私たちはそれのための別のエンドポイントを持っていた)。 V2モデルで
class Game {
public $id;
public $datePlayed;
public $players = [];
public $homeTeam = [];
public $awayTeam = [];
}
、我々は、データベーステーブルの実際の表現(モデリングのアクティブレコードのアプローチのようなモデルは、永続層に基づいていた)を行います。したがって、ゲームモデルにはプレイヤーは含まれません(プレイヤーは全く異なるオブジェクトなので)。
class Game {
public $id;
public $datePlayed;
public $homeTeamId;
public $awayTeamId;
}
これまでのところ、私たちは実際に冗長性と不要なデータの多くのネストされたバージョン我々が必要とするリソースを取得していないため、最終的な結果は非常に良いと思います。
しかし、今私は新しい挑戦をしています。実際のデータベース表現ではない詳細情報を返す必要があるエンドポイントがあります。私たちは完璧な世界ではないので、APIを使用する開発者が実際にすべての属性について多くの要求を出すことを望んでいません。関連リソースの基本情報を提供するための解決策が必要です。 。私たちのゲームのエンドポイントに戻っ例えばので
- >私は彼らが私に正確なデータベースオブジェクト
{
"datePlayed": "2016-04-29T17:20:08+00:00",
"homeTeamId": 5,
"awayTeamId": 15
}
しかし、私はとの応答を飾るしたいGETのためにあるペイロードを送りたいん作成します基本データ(オブジェクト全体ではなく、開発者が基本情報を取得し、基本情報ではなく完全な関連リソースを取得する新しい要求のみ)まず
{
"datePlayed": "2016-04-29T17:20:08+00:00",
"homeTeam": {
"id": 5,
"name": "Killer clan"
},
"awayTeam": {
"id": 15,
"name": "Retry team"
}
}
私は、要求に応じて新しいオブジェクトを作成し、GETメソッドでそれを返すが、POSTを検証し、実際のモデルに要求を置くだろうcontroller->リポジトリにこの責任を委任。しかし、あなたが送信しているものを理解するためにコードを掘り下げなければならないので、これは長期的にはあまりにも保守的ではないようです。
私は長い考えを持ちましたが、コンベンションスタブ(小切手、領収書、切符、その他の書類の一部を切り取って記録として残したもの)で新しいモデルを作成する考えがあります。レスポンスの構造を宣言します。例:/私は、プレースホルダやメタデータはまた、良好な命名規則ですが、要点は同じだと思います。この
class GameStub {
public $id;
public $datePlayed;
public $homeTeam = [];
public $awayTeam = [];
}
ようGameStubモデルクラスを作成します。
あなたはこのソリューションについてどう思いますか?それは理にかなっていますか?
偉大な答え!洞察に感謝します! – Bernardo