Heim >Web-Frontend >js-Tutorial >Anwendung von JSONAPI in PHP

Anwendung von JSONAPI in PHP

小云云
小云云Original
2017-12-25 14:54:561492Durchsuche

Jetzt besteht die Hauptaufgabe serverseitiger Programmierer nicht mehr darin, Vorlagen festzulegen, sondern JSON-basierte API-Schnittstellen zu schreiben. 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:

Wenn ich gebeten würde, mein Lieblings-PHP-Toolkit auszuwählen, würde Fractal definitiv auf der Liste stehen. Es verbirgt die Implementierungsdetails und ermöglicht Benutzern den Einstieg, ohne das JSONAPI-Protokoll überhaupt verstehen zu müssen . Wenn Sie es jedoch in Ihrem eigenen Projekt verwenden möchten, können Sie anstelle von Fractal direkt Fractalistic ausprobieren, das Fractal kapselt, um die Verwendung zu vereinfachen:

<?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 PHP nackt schreiben, ist Fractalistic grundsätzlich die beste Wahl. Wenn Sie jedoch einige Full-Stack-Frameworks verwenden, ist Fractalistic möglicherweise nicht elegant genug, da es sich nicht in die vorhandenen Funktionen des Frameworks selbst integrieren lässt Perfekte Integration, nehmen Sie Lavaral als Beispiel. Es verfügt über eine integrierte API-Ressourcenfunktion. Auf dieser Basis habe ich einen JsonApiSerializer implementiert, der perfekt in das Framework integriert werden kann >
Die Ressource, die

<?php
Fractal::create()
  ->collection($articles)
  ->transformWith(new ArticleTransformer())
  ->includeAuthor()
  ->toArray();
?>
entspricht, ist im Wesentlichen dieselbe wie zuvor, mit der Ausnahme, dass der Rückgabewert geändert wurde:


<?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 Der Controller ähnelt auch dem Original, wurde gerade hinzugefügt. Ein isRoot-Attribut wurde hinzugefügt, um den Stamm zu identifizieren:


<?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);
  }
}
?>
Der gesamte Prozess greift nicht zu sehr in die Architektur von Laravel ein. Man kann sagen, dass dies derzeit die beste Möglichkeit ist, JSONAPI in Laravel zu implementieren. Wenn Sie interessiert sind, können Sie die Implementierung von JsonApiSerializer studieren Es ist ein großer Aufwand, es umzusetzen. Man kann sagen, dass es harte Arbeit ist.

Verwandte Empfehlungen:

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

Zusammenfassung der Verwendung von Ajax und JSONP


Detaillierte Erläuterung der Instanz von Javascript zum Herunterladen JSON-Format-Array Mehrere Fälle von JSON-Wertübertragung und PHP-Empfang für Excel-Tabelle

Das obige ist der detaillierte Inhalt vonAnwendung von 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