Laravel APIリソースの第一印象

画像






昨夜、 Taylor Otwellは、Laravel 5.5フレームワークでAPIを開発する際に、フラクタルの置き換えの始まりになる可能性があることをようやく明らかにしました。 これが私の記事の試用版です。行きましょう。



興味深い資料は4番目のステップから始まります。



1.アプリケーションのインストール



composer create-project laravel/laravel responses dev-develop cd responses touch database/database.sqlite php artisan make:model Post -mfa php artisan make:resource UsersWithPostsResource php artisan make:resource PostsResource php artisan make:controller UsersController --resource
      
      





プロジェクトの.env



ファイルにSQLiteデータベースの使用を登録し、他のすべてを削除します。



 DB_CONNECTION=sqlite
      
      





2.データベースの準備



2.1。 The posts migration



作成する



 Schema::create('posts', function (Blueprint $table) { $table->increments('id'); $table->string('title'); $table->string('body'); $table->unsignedInteger('user_id'); $table->timestamps(); });
      
      





2.2。 ファクトリーの作成: database/factories/PostFactory.php







 <?php use Faker\Generator as Faker; $factory->define(App\Post::class, function (Faker $faker) { return [ 'title' => $faker->sentence, 'body' => $faker->paragraph, 'user_id' => function () { return factory(\App\User::class); } ]; });
      
      





2.3 app/User.php



リレーションを追加する



 public function posts() { return $this->hasMany(Post::class); }
      
      





2.4 app/Post.php



での大量割り当てを避ける



 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Post extends Model { protected $guarded = []; }
      
      





2.5データベースへのテストデータの入力



 php artisan migrate:fresh php artisan tinker factory(App\Post::class)->times(2)->create(); factory(App\Post::class)->times(2)->create(['user_id' => 1]);
      
      





3.ルートのセットアップ



 Route::apiResource('/users', 'UsersController');
      
      





4.モデルをリソースに変換する



 /** * Display a listing of the resource. * * @param User $user * @return \Illuminate\Http\Response */ public function index(User $user) { return new UsersWithPostsResource($user->paginate()); }
      
      





5.リソース投稿を持つユーザー



 <?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\Resource; class UsersWithPostsResource extends Resource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request * @return array */ public function toArray($request) { // Eager load $this->resource->load('posts'); return $this->resource->map(function ($item) { return [ 'name' => $item->name, 'email' => $item->email, 'posts' => new PostsResource($item->posts) ]; }); } }
      
      





6.リソースの投稿



 <?php namespace App\Http\Resources; use Illuminate\Http\Resources\Json\Resource; class PostsResource extends Resource { /** * Transform the resource into an array. * * @param \Illuminate\Http\Request * @return array */ public function toArray($request) { return $this->resource->map(function ($item) { return [ 'title' => $item->title ]; }); } }
      
      





7.結論



Fractalと比較した最初の明らかな違いは、リソースがすべてのオブジェクトではなく、コレクション全体に単純かつ直接アクセスできることです。 これは、ユーザーのコレクションを変換するときに、N + 1クエリなしで各レコードを簡単にダウンロードできることを意味します。



新しいリソースクラスを作成するだけで、必要に応じてデータを変換できるため、ポイントを簡単に変換できます。



Laravel APIリソースの機能をさらに構築したらすぐに、このトピックをさらに詳しく説明します。



翻訳者から



私はこのトピックを興味深いと感じ、言語の適応とともに翻訳することにしました。 蹴らないでください。 このトピックに関する元のドキュメントおよび翻訳されたドキュメントへのリンクも歓迎します。



All Articles