はじめに
こちらの続きとなっています。
今回はLaravelで簡単にAPIを作ってみようと思います。またSeederを使用して簡単なサンプルデータを作成しています。
環境:
OS : macOS High Sierra 10.13.6
MAMP : 5.1
Laravel : 5.7.6
データの作成
マイグレーションファイルの作成
予定のデータとして「task」テーブルを作成していきます。
$ php artisan make:migration create_tasks_table --create=tasks
「/database/migrations/DATETIME_create_tasks_table.php」を編集します。
public function up() { Schema::create('tasks', function (Blueprint $table) { $table->increments('id'); $table->string('name'); // 追加 $table->text('description'); // 追加 $table->integer('client_id'); // 追加 $table->timestamps(); }); }
モデルを作成する
$ php artisan make:model Task
マイグレーションの実行
$ php artisan migrate
サンプルデータの作成
Seederを作成する
初期データを作成するために「seeder」を使用する
$ php artisan make:seeder ClientsTableSeeder $ php artisan make:seeder TasksTableSeeder
「/database/seeds/ClientsTableSeeder.php」
public function run() { factory(App\Client::class, 50)->create(); }
「/database/seeds/TasksTableSeeder.php」
public function run() { factory(App\Task::class, 50)->create(); }
「/database/seeds/DatabaseSeeder.php」
public function run() { $this->call(ClientsTableSeeder::class); $this->call(TasksTableSeeder::class); }
Seederを実行すると、「ClientsTableSeeder.php」と「TasksTableSeeder.php」を実行して50件のサンプルデータを作成することができるようになりました。
Model Factoryを作成する
ModelFactoryで「Faker」を使用して、それらしくサンプルデータを作成します。
$ php artisan make:factory ClientFactory $ php artisan make:factory TaskFactory
「/database/factories/ClientFactory.php」
<?php // app/database/factories/UserFactory.php use Faker\Generator as Faker; $factory->define(App\Client::class, function (Faker $faker) { static $password; return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'password' => $password ?: $password = bcrypt('secret'), 'remember_token' => str_random(10), ]; });
「/database/factories/TaskFactory.php」
<?php // app/database/factories/TaskFactory.php use Faker\Generator as Faker; $factory->define(App\Task::class, function (Faker $faker) { $clients = App\Client::pluck('id')->toArray(); return [ 'name' => $faker->unique()->name, 'description' => $faker->realText(200), 'client_id' => $faker->randomElement($clients) ]; });
日本語に設定する
このままだと英語のサンプルデータになるので日本語設定にします
「/config/app.php」に追記します
'faker_locale' => env('DEV_FAKER_LOCALE', 'en_US'),
「/.env」に追記します。
DEV_FAKER_LOCALE=ja_JP
Seederを実行する
$ php artisan db:seed
確認
管理画面からサンプルデータが作成されていることを確認します。
コントローラの作成
Taskのリソースを作成する
$ php artisan make:resource Task
「/app/Http/Resources/Task.php」を編集する
public function toArray($request) { return [ 'id' => $this->id, 'task' => $this->name, 'task_description' => $this->description ]; }
TaskContorllerを作成する
$ php artisan make:controller TaskController
「/app/Http/Controllers/TaskController.php」を編集する
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Resources; use App\Task; use App\Http\Resources\Task as TaskResource; class TaskController extends Controller { public function index() { //Get all task $tasks = Task::paginate(15); // Return a collection of $task with pagination return TaskResource::collection($tasks); } public function show($id) { //Get the task $task = Task::findOrfail($id); // Return a single task return new TaskResource($task); } public function destroy($id) { //Get the task $task = Task::findOrfail($id); if($task->delete()) { return new TaskResource($task); } } public function store(Request $request) { $task = $request->isMethod('put') ? Task::findOrFail($request->task_id) : new Task; $task->id = $request->input('task_id'); $task->name = $request->input('name'); $task->description = $request->input('description'); $task->user_id = 1; //$request->user()->id; if($task->save()) { return new TaskResource($task); } } }
ルーティングの設定
「/routes/api.php」
// get list of tasks Route::get('tasks','TaskController@index'); // get specific task Route::get('task/{id}','TaskController@show'); // create new task Route::post('task','TaskController@store'); // update existing task Route::put('task','TaskController@store'); // delete a task Route::delete('task/{id}','TaskController@destroy');
確認
postmanでAPIの動作を確認してみます。
「http://localhost:8888/api/tasks」
コメント