Laravel開発:3.APIの作成

はじめに

https://ksysnote.com/php/laravel-auth-voyager/

こちらの続きとなっています。

今回は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」

参考

How to create RESTful API in Laravel 5.7 - Tutorials / Programming tips
In this tutorial, I will show you creating RESTful apis using Laravel 5.7 php framework. We gonna use the Laravel’s API resources to build RESTful…
301 Moved Permanently
LaravelのFakerとSeedingでダミーデータを自動生成しデータベースへ投入する
Laravelにてマイグレーション実行時にシーディングにて初期データを投入しますが、その際に、Fakerにてダミーデータを生成して登録していきます。開発時にユーザデータや商品情報などのテスト用のデータを用意する必要があった時でも、LaravelではFakerというライブラリを使えば、テスト用のフェイクデータを自動で何件...

コメント

タイトルとURLをコピーしました