10yroの開発日記

福岡にある株式会社10yro(トイロ)のエンジニアが書いています

PHP LaravelでRESTful API開発 その1

今回はPHPフレームワークLaravelを利用して、RESTful APIのサンプルを作成したいと思います。
まずは1回目として、Laravelプロジェクトの作成、利用するDBの作成、Modelの作成、Controllerでpostメソッドの実装までをやっていきます。

目次

MySQLにデータベースを作成

まず、APIで利用するデータベースを作成します。
今回はMySQLを利用します。

MySQL Workbenchを利用してデータベースを作成します。

SCHEMASを右クリック→Craeta Schema...をクリック

Nameにapi_sampleと入力して、Applyをクリック

以下の画面でApplyをクリック

以下の画面でFinishをクリック

SCHEMASにapi_sampleが作成されます

Laravelのプロジェクトを作成

プロジェクトを作成するフォルダまで移動して以下のコマンドを実行します。

laravel new api-sample

以下のコマンドで起動してみます。

php artisan serve

以下のように表示されればOKです。

ブラウザで http://127.0.0.1:8000/ にアクセスすると以下のような画面が表示されます。

ModelとMigrationを作成

先程作成したDBにテーブルを作るため、ModelとMigrationファイルを作成します。
今回は本のタイトルや著者などを管理するテーブル「book」を作成します。

以下のコマンドを実行します。

 php artisan make:model Book -m

以下のようにapp/ModelsにBook.php、database/migrationsに2022_11_24_053031_create_books_table.phpというファイルが作成されました。

作成されたmigrationのファイルを見てみます。
upメソッドでテーブルを生成する処理(create table)が実行されます。
デフォルトではidとtimestampsが定義されていますので、必要に応じてこのメソッド内にテーブルのカラムの定義を記述します。
timestampsはcreated_at, updated_atの2つのカラムが生成されます。

<?php
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

downメソッドでは、テーブルを削除する処理(drop table)が実行されます。
upメソッドで行った変更を元に戻す処理を記述することとなります。

<?php
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('books');
    }
};

upメソッドを以下のように修正します。
title, author, memoという文字列のカラムを追加しました。
memoについてはnull許可としています。

<?php
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('books', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->string('author');
            $table->string('memo')->nullable();
            $table->timestamps();
        });
    }

次はModelを以下のように修正します。
protected $fillableの記述を追加しました。

<?php
class Book extends Model
{
    use HasFactory;

    protected $fillable = [
        'title',
        'author',
        'memo'
    ];
}

.envにDB接続先情報を設定

プロジェクトのルートにある.envファイルのDB接続先情報を修正します。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=api_sample
DB_USERNAME=<your user name>
DB_PASSWORD=<your password>

Migrationの実行

コマンドプロンプトで以下のコマンドを実行し、DBにBookテーブルを作成します。

php artisan migrate

以下のように実行結果が表示されます。
(book以外はlaravelのデフォルトで含まれるmigrationファイルですので、不要であれば実行前に削除してください)

MySQL Workbench等のツールでDBを確認するとbookテーブルが生成されていると思います。

Controllerの作成とRouteの設定

次はControllerを作成します。
以下のコマンドを実行してBookControllerを作成します。

php artisan make:controller BookController

app/Http/Controllersの下にBookController.phpが作成されます。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BookController extends Controller
{
    //
}

取得、追加、更新、削除のメソッドを追加します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class BookController extends Controller
{
    /**
     * すべてのbookを取得
     *
     * @return object $result
     */
    public function getAll()
    {
        return "Called getAll";
    }

    /**
     * IDを指定して1件取得
     *
     * @param integer $id
     * @return Bool $result
     */
    public function getById(int $id)
    {
        return "Called getById";
    }

    /**
     * Bookを追加
     *
     * @param Request $request
     * @return void
     */
    public function create(Request $request)
    {
        return "Called create";
    }

    /**
     * Bookを更新
     *
     * @param Request $request
     * @param integer $id
     * @return void
     */
    public function updateById(Request $request, int $id)
    {
        return "Called updateById";
    }

    /**
     * Bookを削除
     *
     * @param integer $id
     * @return void
     */
    public function deleteById(int $id)
    {
        return "Called deleteById";
    }
}

routes/api.phpに以下を追加します。

<?php

Route::get('book', [BookController::class, 'getAll']);
Route::get('book/{id}', [BookController::class, 'getById']);
Route::post('book', [BookController::class, 'create']);
Route::put('book/{id}', [BookController::class, 'updateById']);
Route::delete('book/{id}', [BookController::class, 'deleteById']);
Route::get('book', [BookController::class, 'getAll']);

例えば上記記述をすることで、http://127.0.0.1:8000/api/bookのgetメソッドにアクセスすると、BookControllerのgetAllメソッドが呼び出されることになります。

ここまで終わったら、一度確認のため動かしてみます。
以下のコマンドを実行してください。

php artisan serve

Laravelが起動したら、ブラウザで http://127.0.0.1:8000/api/book アクセスしてみます。
以下の文字が表示されればOKです。

Bookテーブルにレコードを作成(postメソッドの実装)

postメソッドが呼ばれたときに、bookテーブルにレコードを作成します。
コントローラーのcreateメソッドを以下のように修正します。

<?php
    /**
     * Bookを追加
     *
     * @param Request $request
     * @return void
     */
    public function create(Request $request)
    {
        $book = new Book();
        $book->title = $request->title;
        $book->author = $request->author;
        $book->memo = $request->memo;
        $book->save();

        return response()->json([
            'message' => 'created book'
        ], 201);
    }

Postmanというツールでpostメソッドを呼び出します。 以下はPostmanの画面です。

以下のように呼び出した結果がBodyに表示されたらOKです。

Bookテーブルの中身を確認すると、ちゃんとレコードが作成されています。

まとめ

LaravelでAPIの実装どうするんだろ?と思ってましたが、他のサイトを参考にしながらですが、ここまでは順調にできました。
Laravel便利すぎです。 次回はその他メソッドの実装を行っていきたいと思います。