ホームページ >バックエンド開発 >PHPチュートリアル >PHP Fractal -API' s jsonをかなり常に作りましょう!

PHP Fractal -API' s jsonをかなり常に作りましょう!

Lisa Kudrow
Lisa Kudrowオリジナル
2025-02-10 09:01:09395ブラウズ

PHP Fractal - Make Your API's JSON Pretty, Always!

この記事は、Viraj Khatavkarによって査読されました。 SetePointコンテンツを最高に獲得してくれたSetePointのすべてのピアレビューアに感謝します!

以前にAPIを構築したことがある場合、データを直接応答として出力することに慣れていると思います。これは正しく行われた場合に有害ではないかもしれませんが、この問題を解決するのに役立ついくつかの実用的な選択肢があります。

利用可能なソリューションの1つはフラクタルです。これにより、モデルを応答として返す前に、モデルの新しい変換レイヤーを作成できます。非常に柔軟で、あらゆるアプリケーションやフレームワークに簡単に統合できます。

PHP Fractal - Make Your API's JSON Pretty, Always! キーポイント

PHP Fractalは、開発者がモデルの新しい変換層を作成してから応答として返すことができるソリューションであり、JSONデータを管理し、一貫性を整えることができます。
  • Fractalは柔軟で、あらゆるアプリケーションまたはフレームワークに統合しやすいです。 Transformerを使用して複雑なデータ構造をより単純な形式に変換し、Serializerを使用して最終出力をフォーマットすることで機能します。
  • Fractalは、ユーザーが要求したときに応答にサブリソース(関係)を含めることを可能にし、データレンダリングに柔軟性と制御の別の層を追加します。
  • Fractalを使用すると、関係を一度にロードすることでクエリパフォーマンスを最適化することができ、雄弁なロードが頻繁に遭遇するN 1の問題を解決します。
  • インストール

Laravel 5.3アプリケーションを使用して例を構築し、フラクタルパッケージを統合します。そのため、インストーラーを使用するか、Composerを介して新しいLaravelアプリケーションを作成します。

または
<code>laravel new demo</code>

次に、フォルダー内でフラクタルパッケージが必要です。
<code>composer create-project laravel/laravel demo</code>

データベースを作成します
<code>composer require league/fractal</code>

データベースには、ユーザーと役割テーブルが含まれています。各ユーザーには役割があり、各役割には許可リストがあります。

<code class="language-php">// app/User.php

class User extends Authenticatable
{
    protected $fillable = [
        'name',
        'email',
        'password',
        'role_id',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function role()
    {
        return $this->belongsTo(Role::class);
    }
}</code>
トランスを作成
<code class="language-php">// app/Role.php

class Role extends Model
{
    protected $fillable = [
        'name',
        'slug',
        'permissions'
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function users()
    {
        return $this->hasMany(User::class);
    }
}</code>

各モデルのトランスを作成します。ユーザートランスフォーマーのクラスは次のようになります:

はい、変圧器を作成するのは簡単です!開発者が管理できる方法でデータを変換するだけでなく、ORMやリポジトリに任せません。
<code class="language-php">// app/Transformers/UserTransformer.php

namespace App\Transformers;

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{
    public function transform(User $user)
    {
        return [
            'name' => $user->name,
            'email' => $user->email
        ];
    }
}</code>

TransformerAbstractクラスを拡張し、Transformメソッドを定義します。これは、ユーザーインスタンスを使用して呼び出されます。 Roletransformerクラスにも同じことが言えます。

コントローラーを作成します
<code class="language-php">namespace App\Transformers;

use App\Role;
use League\Fractal\TransformerAbstract;

class RoleTransformer extends TransformerAbstract
{
    public function transform(Role $role)
    {
        return [
            'name' => $role->name,
            'slug' => $role->slug,
            'permissions' => $role->permissions
        ];
    }
}</code>

コントローラーは、データをユーザーに送信する前にデータを変換する必要があります。ここで、UsersControllerクラスを処理し、インデックスと表示操作のみを一時的に定義します。

インデックス操作は、データベースからすべてのユーザーをクエリし、ユーザーリストとコンバーターを使用してリソースのコレクションを作成し、実際の変換プロセスを実行します。

<code class="language-php">// app/Http/Controllers/UsersController.php

class UsersController extends Controller
{
    /**
     * @var Manager
     */
    private $fractal;

    /**
     * @var UserTransformer
     */
    private $userTransformer;

    function __construct(Manager $fractal, UserTransformer $userTransformer)
    {
        $this->fractal = $fractal;
        $this->userTransformer = $userTransformer;
    }

    public function index(Request $request)
    {
        $users = User::all(); // 从数据库获取用户
        $users = new Collection($users, $this->userTransformer); // 创建资源集合转换器
        $users = $this->fractal->createData($users); // 转换数据

        return $users->toArray(); // 获取转换后的数据数组
    }
}</code>
もちろん、すべてのユーザーを一度に返すことは意味がありません。このためにポケットベルを実装する必要があります。

ページネーション

laravelは物事を単純化する傾向があります。このようなページネーションを実装することができます:

<code>laravel new demo</code>

しかし、これがフラクタルで動作するためには、データを変換してポケットベルを呼び出すためにコードを追加する必要がある場合があります。

<code>composer create-project laravel/laravel demo</code>

最初のステップは、モデルからのデータをページングすることです。次に、以前のようにリソースコレクションを作成し、コレクションにポケットベルをセットアップします。

Fractalは、symfonyとZend用のアダプターも提供する長さのAwarepaginatorクラスを変換するために、PaginatorアダプターをLaravelに提供します。

<code>composer require league/fractal</code>

ページングの詳細に追加のフィールドを追加することに注意してください。ドキュメントでページングの詳細を読むことができます。

サブリソース

を含む

フラクタルに精通しているので、ユーザーがリクエストしたときにサブリソース(関係)を応答に含める方法を学ぶ時が来ました。

http://demo.vaprobash.dev/users?clude=roleなど、応答に追加のリソースを含めることをリクエストできます。コンバーターは、要求されている内容を自動的に検出し、インクルードパラメーターを解析できます。

<code class="language-php">// app/User.php

class User extends Authenticatable
{
    protected $fillable = [
        'name',
        'email',
        'password',
        'role_id',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function role()
    {
        return $this->belongsTo(Role::class);
    }
}</code>

$ includesプロパティは、コンバーターに、応答に追加のデータを含める必要があることを伝えます。 include queryパラメーターがユーザーの役割を要求する場合、includeroleメソッドを呼び出します。

<code class="language-php">// app/Role.php

class Role extends Model
{
    protected $fillable = [
        'name',
        'slug',
        'permissions'
    ];

    /**
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function users()
    {
        return $this->hasMany(User::class);
    }
}</code>

$ this-&gt; fractal-&gt; parseincludesラインは、含まれるクエリパラメーターを解析する責任があります。ユーザーのリストをリクエストした場合、次のようなものを見る必要があります:

<code class="language-php">// app/Transformers/UserTransformer.php

namespace App\Transformers;

use App\User;
use League\Fractal\TransformerAbstract;

class UserTransformer extends TransformerAbstract
{
    public function transform(User $user)
    {
        return [
            'name' => $user->name,
            'email' => $user->email
        ];
    }
}</code>

各ユーザーにロールリストがある場合、コンバーターを次のようなものに変更できます。

<code class="language-php">namespace App\Transformers;

use App\Role;
use League\Fractal\TransformerAbstract;

class RoleTransformer extends TransformerAbstract
{
    public function transform(Role $role)
    {
        return [
            'name' => $role->name,
            'slug' => $role->slug,
            'permissions' => $role->permissions
        ];
    }
}</code>
にサブリソースが含まれている場合、

ポイント表記を使用して関係をネストできます。各役割に別のテーブルに保存されている権限のリストがあると仮定し、ユーザーの役割と権限を持つユーザーをリストしたいと考えています。含めることができます= role.permissions。 時々、アドレスアソシエーションなど、デフォルトで必要なアソシエーションをデフォルトで含める必要があります。これを行うには、コンバーター内の$ defaultIncludesプロパティを使用できます。

フラクタルパッケージに関する私のお気に入りの1つは、パラメーターをパラメーターに渡すことができることです。ドキュメントの良い例は、順番に並べ替えることです。次のように例に適用できます:
<code class="language-php">// app/Http/Controllers/UsersController.php

class UsersController extends Controller
{
    /**
     * @var Manager
     */
    private $fractal;

    /**
     * @var UserTransformer
     */
    private $userTransformer;

    function __construct(Manager $fractal, UserTransformer $userTransformer)
    {
        $this->fractal = $fractal;
        $this->userTransformer = $userTransformer;
    }

    public function index(Request $request)
    {
        $users = User::all(); // 从数据库获取用户
        $users = new Collection($users, $this->userTransformer); // 创建资源集合转换器
        $users = $this->fractal->createData($users); // 转换数据

        return $users->toArray(); // 获取转换后的数据数组
    }
}</code>

ここで重要な部分はリスト($ ordercol、$ orderby)= $ parambag-&gt; get( 'order')?:['created_at'、 'desc'];ユーザーは、クエリビルダーに含めて適用します。
<code class="language-json">{
  "data": [
    {
      "name": "Nyasia Keeling",
      "email": "crooks.maurice@example.net"
    },
    {
      "name": "Laron Olson",
      "email": "helen55@example.com"
    },
    {
      "name": "Prof. Fanny Dach III",
      "email": "edgardo13@example.net"
    },
    {
      "name": "Athena Olson Sr.",
      "email": "halvorson.jules@example.com"
    }
    // ...
  ]
}</code>

パラメーター(/leoles?include = users:order(name | asc))を渡すことにより、含まれるユーザーリストを順に並べ替えることができます。ドキュメントにリソースを含めることの詳細を読むことができます。

しかし、ユーザーが関連する役割を持っていない場合はどうなりますか? NULLの代わりに有効なデータが予想されるため、停止し、エラーが表示されます。 null値を表示する代わりに、関係を応答から削除しましょう。

<code>laravel new demo</code>

緊急読み込み

雄弁はモデルにアクセスするときにモデルの読み込みを遅らせるため、n 1 問題に遭遇する可能性があります。これは、クエリを最適化するために、1回限りの熱心なロード関係によって解決できます。

<code>composer create-project laravel/laravel demo</code>
この方法では、モデル関係にアクセスする際に追加のクエリはありません。

結論

私はフィル・スタージョンの「あなたが嫌い​​なAPIの構築」を読んでいる間にフラクタルにつまずいた。

APIを構築するときにコンバーターを使用しましたか?同じ作業を行う優先パッケージはありますか、それともjson_encodeを使用しているだけですか?以下のコメントセクションでお知らせください!

PHP Fractal FAQ

PHPフラクタルとは何ですか?なぜそれが重要なのですか?

PHP Fractalは、APIのデータをレンダリングおよび変換するのに役立つ強力なツールです。それは、APIのデータ出力が一貫性があり、十分に構造化され、理解しやすいことを保証する、複雑でネストされたデータ構造を出力する標準化された方法を提供するため、重要です。これにより、開発者はAPIを使用しやすくなり、エラーの可能性が低下します。

PHPフラクタルはどのように機能しますか?

PHP Fractalは、複雑なデータ構造を取得し、それらを使いやすい形式に変換することにより機能します。 TransformerとSerializerの2つの主要なコンポーネントを介して実装されています。 Transformerは、複雑なデータをより単純な形式に変換する責任を負い、シリアナーは最終出力を形成します。

PHP Fractalの変圧器とは何ですか?

PHP Fractalのトランスは、API応答でアプリケーションデータを出力する方法を定義するクラスです。複雑なデータ構造を取り、それらをよりシンプルで使いやすい形式に変換します。これにより、API応答に含まれているデータと構造化方法を正確に制御できます。

PHP FractalのSerializerとは何ですか?

PHP Fractalのシリアナーは、APIの最終出力のフォーマットを担当します。トランスによって変換されたデータを取得し、特定の構造にフォーマットします。これにより、APIの出力が一貫して理解しやすいことを確認できます。

プロジェクトにPHP Fractalを実装するにはどうすればよいですか?

プロジェクトにPHP Fractalの実装では、Fractal LibraryをComposerからインストールし、データ用のトランスを作成し、Fractalクラスを使用してトランスを使用してデータを変換することが含まれます。その後、Fractalのシリアイザーの1つを使用して、変換されたデータを出力できます。

PHPプロジェクトでPHP Fractalを使用できますか?

はい、PHP Fractalは、あらゆるPHPプロジェクトで使用できるスタンドアロンライブラリです。特定のフレームワークやプラットフォームに依存していないため、PHP開発者にとって普遍的なツールになります。

PHP Fractalを使用することの利点は何ですか?

PHP Fractalを使用すると、多くの利点があります。 APIの出力が一貫性があり、十分に構造化されていることを保証し、開発者が使用しやすくなります。また、複雑なデータ構造を変換する標準化された方法を提供し、エラーの可能性を減らし、コードを維持しやすくすることができます。

PHP Fractalは他のデータ変換ツールとどのように比較されますか?

PHP Fractalは、そのシンプルさと柔軟性で際立っています。複雑なデータ構造を変換するための簡単な方法を提供し、トランスとシリアイザーを使用して高いカスタマイズを可能にします。これにより、APIを使用する開発者にとって強力なツールになります。

PHP Fractalの出力をカスタマイズできますか?

はい、PHP Fractalは高度にカスタマイズ可能です。カスタムトランスを作成して、データの変換方法を正確に制御でき、さまざまなシリアル化器を使用して異なる方法で出力をフォーマットできます。これにより、APIの出力を特定のニーズに合わせて調整できます。

PHP Fractalの詳細はどこで学ぶことができますか?

PHP Fractalの詳細を学ぶのに役立つ多くのリソースがあります。公式PHPリーグのウェブサイトは包括的なドキュメントを提供しており、オンラインで多くのチュートリアルやブログ投稿があります。さらに、PHP Fractal Githubリポジトリは、コードを探索し、その使用方法の例を見るのに最適な場所です。

以上がPHP Fractal -API&#x27; s jsonをかなり常に作りましょう!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。