Heim  >  Artikel  >  Web-Frontend  >  So verwenden Sie JSONAPI in PHP

So verwenden Sie JSONAPI in PHP

亚连
亚连Original
2018-06-15 17:27:361188Durchsuche

Dieser Artikel stellt hauptsächlich eine ausführliche Analyse der Anwendung von JSONAPI in PHP vor. Freunde, die es benötigen, können darauf zurückgreifen

Jetzt besteht die Hauptaufgabe von Serverprogrammierern nicht mehr darin, Vorlagen festzulegen, sondern Schreiben basierend auf der JSON-API-Schnittstelle. Leider hat jeder sehr unterschiedliche Schreibstile für Schnittstellen, was eine Menge unnötiger Kommunikationskosten bei der Systemintegration mit sich bringt. Wenn Sie ähnliche Probleme haben, sollten Sie auch auf JSONAPI achten, einen Standard zum Erstellen von APIs auf JSON-Basis. ein einfaches Die API-Schnittstelle von Um den Typ und die Identität des Hauptobjekts darzustellen, werden andere einfache Attribute in Attributen platziert. Wenn das Hauptobjekt Eins-zu-Eins-, Eins-zu-Viele- und andere verwandte Objekte hat, werden diese platziert In Beziehungen wird jedoch nur ein Link über die Felder „Typ“ und „ID“ platziert. Die tatsächlichen Inhalte der verknüpften Objekte werden alle im Stammkontakt enthalten.

Mit JSONAPI wird der Prozess der Datenanalyse standardisiert, wodurch unnötige Kommunikationskosten eingespart werden. Allerdings ist es immer noch sehr mühsam, JSONAPI-Daten manuell zu erstellen. Glücklicherweise kann der Implementierungsprozess mit Fractal relativ automatisiert werden. Wenn das obige Beispiel mit Fractal implementiert wird, sieht es wahrscheinlich so aus:

<?php
use League\Fractal\Manager;
use League\Fractal\Resource\Collection;
$articles = [
  [
    &#39;id&#39; => 1,
    &#39;title&#39; => &#39;JSON API paints my bikeshed!&#39;,
    &#39;body&#39; => &#39;The shortest article. Ever.&#39;,
    &#39;author&#39; => [
      &#39;id&#39; => 42,
      &#39;name&#39; => &#39;John&#39;,
    ],
  ],
];
$manager = new Manager();
$resource = new Collection($articles, new ArticleTransformer());
$manager->parseIncludes(&#39;author&#39;);
$manager->createData($resource)->toArray();
?>

Wenn Sie mich bitten, meinen Favoriten unter den PHP-Toolkits auszuwählen, muss Fractal auf der Liste stehen. Es verbirgt die Implementierungsdetails und ermöglicht Benutzern den Einstieg, ohne das JSONAPI-Protokoll überhaupt zu kennen. Wenn Sie es jedoch in Ihrem eigenen Projekt verwenden möchten, können Sie, anstatt Fractal direkt zu verwenden, Fractalistic ausprobieren, das Fractal kapselt, um die Verwendung zu vereinfachen:

<?php
Fractal::create()
  ->collection($articles)
  ->transformWith(new ArticleTransformer())
  ->includeAuthor()
  ->toArray();
?>

Wenn Sie PHP nackt schreiben. Wenn ja, dann Fractalistic ist im Grunde die beste Wahl. Wenn Sie jedoch ein Full-Stack-Framework verwenden, ist Fractalistic möglicherweise nicht elegant genug, da es nicht perfekter in die vorhandenen Funktionen des Frameworks selbst integriert werden kann Eine integrierte API-Ressourcenfunktion. Auf dieser Basis habe ich einen JsonApiSerializer implementiert, der perfekt in das Framework integriert werden kann. Der Code lautet wie folgt:

<?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 = [
      &#39;data&#39; => $this->data,
    ];
    if (static::$included) {
      $result[&#39;included&#39;] = static::$included;
    }
    if (!$this->resource->resource instanceof AbstractPaginator) {
      return $result;
    }
    $paginated = $this->resource->resource->toArray();
    $result[&#39;links&#39;] = $this->links($paginated);
    $result[&#39;meta&#39;] = $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 = [
        &#39;type&#39; => $included[&#39;type&#39;],
        &#39;id&#39; => $included[&#39;id&#39;],
      ];
      if (is_int($key)) {
        $this->data[&#39;relationships&#39;][$type][&#39;data&#39;][] = $data;
      } else {
        $this->data[&#39;relationships&#39;][$type][&#39;data&#39;] = $data;
      }
      static::$included[] = $included;
    } else {
      $this->data[] = $value->resolve();
    }
  }
  protected function serializeNonResource($key, $value)
  {
    switch ($key) {
      case &#39;id&#39;:
        $value = (string)$value;
      case &#39;type&#39;:
      case &#39;links&#39;:
        $this->data[$key] = $value;
        break;
      default:
        $this->data[&#39;attributes&#39;][$key] = $value;
    }
  }
  protected function links($paginated)
  {
    return [
      &#39;first&#39; => $paginated[&#39;first_page_url&#39;] ?? null,
      &#39;last&#39; => $paginated[&#39;last_page_url&#39;] ?? null,
      &#39;prev&#39; => $paginated[&#39;prev_page_url&#39;] ?? null,
      &#39;next&#39; => $paginated[&#39;next_page_url&#39;] ?? null,
    ];
  }
  protected function meta($paginated)
  {
    return [
      &#39;current_page&#39; => $paginated[&#39;current_page&#39;] ?? null,
      &#39;from&#39; => $paginated[&#39;from&#39;] ?? null,
      &#39;last_page&#39; => $paginated[&#39;last_page&#39;] ?? null,
      &#39;per_page&#39; => $paginated[&#39;per_page&#39;] ?? null,
      &#39;to&#39; => $paginated[&#39;to&#39;] ?? null,
      &#39;total&#39; => $paginated[&#39;total&#39;] ?? null,
    ];
  }
  protected function isRootResource()
  {
    return isset($this->resource->isRoot) && $this->resource->isRoot;
  }
}
?>

Die entsprechende Ressource ist im Grunde die gleiche wie zuvor dass der Rückgabewert geändert wurde: Der entsprechende Controller von

<?php
namespace App\Http\Resources;
use App\Article;
use Illuminate\Http\Resources\Json\Resource;
use App\Http\Serializers\JsonApiSerializer;
class ArticleResource extends Resource
{
  public function toArray($request)
  {
    $value = [
      &#39;type&#39; => &#39;articles&#39;,
      &#39;id&#39; => $this->id,
      &#39;name&#39; => $this->name,
      &#39;author&#39; => $this->whenLoaded(&#39;author&#39;),
    ];
    return new JsonApiSerializer($this, $value);
  }
}
?>

ist fast derselbe wie zuvor, außer dass ein isRoot-Attribut hinzugefügt wurde, um die Wurzel zu identifizieren:

<?php
namespace App\Http\Controllers;
use App\Article;
use App\Http\Resources\ArticleResource;
class ArticleController extends Controller
{
  protected $article;
  public function __construct(Article $article)
  {
    $this->article = $article;
  }
  public function show($id)
  {
    $article = $this->article->with(&#39;author&#39;)->findOrFail($id);
    $resource = new ArticleResource($article);
    $resource->isRoot = true;
    return $resource;
  }
}
?>

Der gesamte Prozess tut dies nicht Man kann sagen, dass Laravel derzeit die optimale Lösung für JSONAPI implementiert. Wenn Sie interessiert sind, können Sie sich die Implementierung von JsonApiSerializer ansehen Es ist ein großer Aufwand, es umzusetzen. Man kann sagen, dass jeder Schritt harte Arbeit ist.

Ich habe das Obige für Sie zusammengestellt und hoffe, dass es Ihnen in Zukunft hilfreich sein wird.

Verwandte Artikel:

Hintergrundbild in Vue festlegen

So verwenden Sie Vue + Less, um eine einfache Skin-Änderungsfunktion zu implementieren

So implementieren Sie dieselbe Interviewfragenkomponente mit Angular, React und Vue

Verwenden Sie jQuery, um beim Scrollen nach unten automatisch zu laden

So implementieren Sie ein modales Dialogfeld in Angular2.0

So implementieren Sie den Bewegungspufferungseffekt in JS (ausführliches Tutorial)

Das obige ist der detaillierte Inhalt vonSo verwenden Sie JSONAPI in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn