PHP で JSONAPI を使用する方法

php中世界最好的语言
リリース: 2018-04-13 16:03:09
オリジナル
1938 人が閲覧しました

今回は、PHP で JSONAPI を使用する方法について説明します。以下は、PHP で JSONAPI を使用する際の 注意事項 について説明します。

現在、サーバープログラマーの主な仕事は、テンプレートを設定することではなく、JSON ベースの API を作成することです。 インターフェース。残念ながら、人によってインターフェースの書き方が大きく異なることが多く、システム統合に不必要な通信コストが多くかかるため、同様の問題を抱えている場合は、JSONAPI に注目したほうがよいでしょう。 、JSON に基づいて API を構築するための仕様標準であり、単純な API インターフェイスは次のようになります。 JSONAPI

簡単な説明: ルート ノードのデータは、メイン オブジェクトのコンテンツを配置するために使用されます。ここで、type と id これは必須フィールドであり、メイン オブジェクトのタイプと ID を表すために使用されます。他のすべての単純な属性は属性に配置されます。 では、メイン オブジェクトに 1 対 1、1 対多、その他の関連オブジェクトがある場合、そのオブジェクトはリレーションシップ内に配置されますが、それは type と id によってのみ行われます。 リンクがフィールドに配置され、関連付けられたオブジェクトの実際のコンテンツがルート連絡先の

include

d に配置されます。

JSONAPI を使用すると、データ解析プロセスが標準化され、不必要な通信コストが節約されます。ただし、JSONAPI データを手動で構築するのは依然として非常に面倒です。幸いなことに、Fractal を使用すると、実装プロセスは比較的自動化できます。おそらく、上記の例を Fractal で実装すると、次のようになります。 私のお気に入りの PHP ツールキットを選ぶとしたら、Fractal が間違いなくリストに入るでしょう。Fractal は実装の詳細を隠しているため、ユーザーは JSONAPI をまったく知る必要がありません。 契約を開始する準備ができています。ただし、独自のプロジェクトで使用したい場合は、Fractal を直接使用する代わりに、Fractal に適した Fractalistic を試すことができます。 使いやすくするためにカプセル化されています:

<?php
use League\Fractal\Manager;
use League\Fractal\Resource\Collection;
$articles = [
  [
    &#39;id&#39; => 1,
    'title' => 'JSON API paints my bikeshed!',
    'body' => 'The shortest article. Ever.',
    'author' => [
      'id' => 42,
      'name' => 'John',
    ],
  ],
];
$manager = new Manager();
$resource = new Collection($articles, new ArticleTransformer());
$manager->parseIncludes('author');
$manager->createData($resource)->toArray();
?>
ログイン後にコピー
PHP を裸で書いている場合は、基本的に Fractalistic が最良の選択ですが、フルスタック フレームワークを使用している場合は、 Fractalistic は、フレームワーク自体の既存の機能とより完全に統合できないため、十分にエレガントではない可能性があります。Lavaral には API が組み込まれています。 リソース関数、これに基づいて、フレームワークと完全に統合できる JsonApiSerializer を実装しました。コードは次のとおりです。 対応するリソースは、戻り値が変更されていることを除いて、基本的に以前と同じです:

<?php
Fractal::create()
  ->collection($articles)
  ->transformWith(new ArticleTransformer())
  ->includeAuthor()
  ->toArray();
?>
ログイン後にコピー
対応するコントローラーは、ルートを識別するために isRoot 属性が追加されている点を除いて、オリジナルとほぼ同じです:

<?php
namespace App\Http\Serializers;
use Illuminate\Http\Resources\MissingValue;
use Illuminate\Http\Resources\Json\Resource;
use Illuminate\Http\Resources\Json\ResourceCollection;
use Illuminate\Pagination\AbstractPaginator;
class JsonApiSerializer implements \JsonSerializable
{
  protected $resource;
  protected $resourceValue;
  protected $data = [];
  protected static $included = [];
  public function construct($resource, $resourceValue)
  {
    $this->resource = $resource;
    $this->resourceValue = $resourceValue;
  }
  public function jsonSerialize()
  {
    foreach ($this->resourceValue as $key => $value) {
      if ($value instanceof Resource) {
        $this->serializeResource($key, $value);
      } else {
        $this->serializeNonResource($key, $value);
      }
    }
    if (!$this->isRootResource()) {
      return $this->data;
    }
    $result = [
      'data' => $this->data,
    ];
    if (static::$included) {
      $result['included'] = static::$included;
    }
    if (!$this->resource->resource instanceof AbstractPaginator) {
      return $result;
    }
    $paginated = $this->resource->resource->toArray();
    $result['links'] = $this->links($paginated);
    $result['meta'] = $this->meta($paginated);
    return $result;
  }
  protected function serializeResource($key, $value, $type = null)
  {
    if ($type === null) {
      $type = $key;
    }
    if ($value->resource instanceof MissingValue) {
      return;
    }
    if ($value instanceof ResourceCollection) {
      foreach ($value as $k => $v) {
        $this->serializeResource($k, $v, $type);
      }
    } elseif (is_string($type)) {
      $included = $value->resolve();
      $data = [
        'type' => $included['type'],
        'id' => $included['id'],
      ];
      if (is_int($key)) {
        $this->data['relationships'][$type]['data'][] = $data;
      } else {
        $this->data['relationships'][$type]['data'] = $data;
      }
      static::$included[] = $included;
    } else {
      $this->data[] = $value->resolve();
    }
  }
  protected function serializeNonResource($key, $value)
  {
    switch ($key) {
      case 'id':
        $value = (string)$value;
      case 'type':
      case 'links':
        $this->data[$key] = $value;
        break;
      default:
        $this->data['attributes'][$key] = $value;
    }
  }
  protected function links($paginated)
  {
    return [
      'first' => $paginated['first_page_url'] ?? null,
      'last' => $paginated['last_page_url'] ?? null,
      'prev' => $paginated['prev_page_url'] ?? null,
      'next' => $paginated['next_page_url'] ?? null,
    ];
  }
  protected function meta($paginated)
  {
    return [
      'current_page' => $paginated['current_page'] ?? null,
      'from' => $paginated['from'] ?? null,
      'last_page' => $paginated['last_page'] ?? null,
      'per_page' => $paginated['per_page'] ?? null,
      'to' => $paginated['to'] ?? null,
      'total' => $paginated['total'] ?? null,
    ];
  }
  protected function isRootResource()
  {
    return isset($this->resource->isRoot) && $this->resource->isRoot;
  }
}
?>
ログイン後にコピー
プロセス全体は、Laravel のアーキテクチャにあまり介入していません。Laravel は現在 JSONAPI を実装していると言えます。 興味がある場合は、JsonApiSerializer を学習してください。 実装するコードはわずか 100 行強ですが、これを実現するまでに多大な労力を費やしました。                                         この記事を読む方法はもうマスターされたと思います。さらに興味をそそられる場合は、PHP 中国語 Web サイトの他の関連記事にも注目してください。

推奨読書:

vue-cli コードを高速化して最適化する方法

Vue.js ユニバーサル アプリケーション フレームワーク Nuxt.js の詳細な説明

ラベル スクロールの切り替えを実装するための JS

以上がPHP で JSONAPI を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート