ホームページ >バックエンド開発 >PHPチュートリアル >PHP Fractal -API' s jsonをかなり常に作りましょう!
この記事は、Viraj Khatavkarによって査読されました。 SetePointコンテンツを最高に獲得してくれたSetePointのすべてのピアレビューアに感謝します!
以前にAPIを構築したことがある場合、データを直接応答として出力することに慣れていると思います。これは正しく行われた場合に有害ではないかもしれませんが、この問題を解決するのに役立ついくつかの実用的な選択肢があります。利用可能なソリューションの1つはフラクタルです。これにより、モデルを応答として返す前に、モデルの新しい変換レイヤーを作成できます。非常に柔軟で、あらゆるアプリケーションやフレームワークに簡単に統合できます。
キーポイント
または
<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>
インデックス操作は、データベースからすべてのユーザーをクエリし、ユーザーリストとコンバーターを使用してリソースのコレクションを作成し、実際の変換プロセスを実行します。
<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を構築するときにコンバーターを使用しましたか?同じ作業を行う優先パッケージはありますか、それともjson_encodeを使用しているだけですか?以下のコメントセクションでお知らせください!
PHP Fractal FAQ
PHPフラクタルはどのように機能しますか?
PHP Fractalの変圧器とは何ですか?
PHP FractalのSerializerとは何ですか?
プロジェクトにPHP Fractalを実装するにはどうすればよいですか?
PHPプロジェクトでPHP Fractalを使用できますか?
PHP Fractalを使用することの利点は何ですか?
PHP Fractalは、そのシンプルさと柔軟性で際立っています。複雑なデータ構造を変換するための簡単な方法を提供し、トランスとシリアイザーを使用して高いカスタマイズを可能にします。これにより、APIを使用する開発者にとって強力なツールになります。
はい、PHP Fractalは高度にカスタマイズ可能です。カスタムトランスを作成して、データの変換方法を正確に制御でき、さまざまなシリアル化器を使用して異なる方法で出力をフォーマットできます。これにより、APIの出力を特定のニーズに合わせて調整できます。
PHP Fractalの詳細を学ぶのに役立つ多くのリソースがあります。公式PHPリーグのウェブサイトは包括的なドキュメントを提供しており、オンラインで多くのチュートリアルやブログ投稿があります。さらに、PHP Fractal Githubリポジトリは、コードを探索し、その使用方法の例を見るのに最適な場所です。
以上がPHP Fractal -API&#x27; s jsonをかなり常に作りましょう!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。