こちらの内容はブログにアップしています。
はじめに
こちらの続きとなっています。
今回は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」