Believe you can

If you can dream it, you can do it.

LaravelでRESTfulAPIを作る〜その1〜

前回の続きでLaravelでAPIを作っていきます。
以前の記事はこちら

chichi1091.hatenablog.jp

chichi1091.hatenablog.jp

作る内容はTODO用のAPIで元ネタは僕が技術書典9で頒布したKtorをLaravel版に作り変えていきます。詳細は以下を御覧ください。

github.com

techbookfest.org

DDLの準備

MySQLにテーブルを作成するためのDDLを用意します。 docker/db/sql配下に init.sql ファイルを作成します。

CREATE TABLE todos (
  id int(11) NOT NULL AUTO_INCREMENT,
  task TEXT NOT NULL,
  PRIMARY KEY (id)
);

ファイルを配置したらdocker-composeを起動させ、テーブルが作られていることを確認します。 もし作られないようであれば docker/db/data 内をすべて削除してから起動してみてください。

f:id:chichi1091:20211024162846p:plain

.env

LaravelからMySQLに接続するための設定を.envファイルに設定します。
その他にもRedisやメールサーバ、AWSの設定などがありますが、デフォルトのままでOKです。

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=database
DB_USERNAME=docker
DB_PASSWORD=docker

初期画面の削除

RESTfulなAPIサーバになるので初期画面を表示は削除します。
server/routes/web.phpに書かれているルーティングはコメントにしておきます。 http://localhostにアクセスすると404が表示されます。

エンドポイント

APIの接続口となるエンドポイントを先に設定してしまいます。 今回利用するエンドポイントは以下になります。

  • GET /todos
  • GET /todos/{id}
  • POST /todos
  • PUT /todos/{id}
  • DELETE /todos/{id}

server/routes/api.php に追記します。

Route::get("/todos", [TodosController::class, "getTodos"]);
Route::get("/todos/{id}", [TodosController::class, "getTodo"]);
Route::post("/todos/{id}", [TodosController::class, "createTodo"]);
Route::put("/todos/{id}", [TodosController::class, "updateTodo"]);
Route::delete("/todos/{id}", [TodosController::class, "deleteTodo"]);

/todosにアクセスされると TodosControllergetTodos メソッドが呼び出されるという意味となります。

Controller

server/app/Http/ControllersTodosControllerクラスを作っていきます。とりあえず空っぽのResponseを返すようにしておき、実際のDBとの接続は次回としたいと思います。

<php

use Illuminate\Routing\Controller as BaseController;

class TodosController extends BaseController
{
    public function getTodos(Request $request): JsonResponse
    {
        return response()->json([], 200);
    }

    public function getTodo(Request $request, int $id): JsonResponse
    {
        return response()->json([], 200);
    }

    public function createTodo(Request $request, int $id): JsonResponse
    {
        return response()->json(null, 201);
    }

    public function updateTodo(Request $request, int $id): JsonResponse
    {
        return response()->json(null, 201);
    }

    public function deleteTodo(Request $request, int $id): JsonResponse
    {
        return response()->json(null, 201);
    }
}

curlAPIを叩いてみると空っぽのデータが返ります。

$ curl http://localhost/api/todos
[]

今回はここまで。次回はDBとの接続を行い完成を目指します。