keshipi's blog

いつでも自分を振り返れるために書きます

Laravel 5.6でJSONデータ出力

目標

WebAPIの練習として、 DBに保存されたデータをJSON出力する。

やらないこと

API認証

DBにデータを用意

今回はsqliteを使用する。
まずは.envを修正していく。
DB_*の項目を削除して、DB_CONNECTION=sqliteを追加。

SQLiteファイルの作成。

touch database/database.sqlite

tasksテーブルの雛形を作成する。

php artisan make:migration create_tasks_table

雛形が作られるので、upメソッドを修正する。

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tasks', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name')->nullable(false);
            $table->boolean('is_done')->default(false);
            $table->timestamps();
        });
    }

マイグレーション実行。 DBにテーブルが作成される。

php artisan migrate

モデルを作っていく

Taskモデルの雛形を作成。

php artisan make:model Task

生成された雛形を変更する。

// app/Task.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Task extends Model
{
    protected $fillable = ['name', 'is_done'];
    protected $casts = [
        'is_done' => 'boolean'
    ];
}

コントローラを作っていく

Taskコントローラの雛形を作成。

php artisan make:controller TaskController --resource

全てのデータを取得し、返却する。

// app/Http/Controllers/TaskController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Task;

class TaskController extends Controller
{
    public function index()
    {
        // 配列を返すと、Laravelが自動でJSONにしてくれる
        return Task::get();
    }
}

テストデータを投入する

database/factories/UserFactory.phpをコピーして、TaskFactoryを作成する。

// database/factories/TaskFactory.php
<?php

use Faker\Generator as Faker;

$factory->define(App\Task::class, function (Faker $faker) {
    return [
        'name' => $faker->name,
        'is_done' => $faker->boolean(),
    ];
});

seederを修正

// database/seeds/DatabaseSeeder.php
<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Task::class, 30)->create();
    }
}

データ投入

php artisan db:seed

ブラウザからデータを確認してみる

API用のroutingを設定する

// laravel-vue-todo/routes/api.php
<?php

use Illuminate\Http\Request;

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
Route::apiResource('tasks', 'TaskController');

ブラウザからhttp://localhost:8000/api/tasksにアクセスするとJSONデータが返ってきてることが確認できるはず。(整形されてない。。。) f:id:keshipi:20180523232134j:plain

※リクエストを投げたときにConnection refusedエラーになったので、サーバを起動しなおした。

参考

https://laravel.com/docs/5.6/eloquent-mutators#attribute-casting