RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【初心者向け】Laravelで WebAPIを作成する。

f:id:syoneshin:20210928114730p:plain こんにちは この記事ではLaravelの環境構築を行い、ごくシンプルなWebAPIを作成します。

Larevelはバックエンドのロジックから画面の描画まで行うことができますが、今回は画面の開発は行わずAPIの開発のみを行います。 バックエンドをAPIとして開発することで、外部アプリケーションと連携することができる・ フロントエンドと疎結合になり保守性が高くなる・フロントエンドと並行して開発することができるといった恩恵を享受することができます。

LaravelはMVCモデルに準じたフレームワークですが、APIを開発する際は画面(View)が不要になります。したがってこの記事ではModelとControllerのみを作成します。

環境・MWのバージョン

  • Ubuntu 20.04

  • PHP 8.0.10

  • Laravel 6.20.34

  • sqlite3

※ 2021年9月現在Laravelはバージョン8系までリリースされていますが、LTSはバージョン6系です。また、リリースから一定期間が経過しており動作が安定している・ 日本語情報が充実しているというメリットがあるのでLaravel 6系を採用しています。

作業手順

  1. Laravelの環境構築

  2. LaravelでAPIを作成

  3. PostmanでLaravelで作成したAPIの動作確認

1. Laravelの環境構築

PHP およびLaravelの動作に必要なパッケージのインストール

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

sudo apt-get update
apt install -y software-properties-common
add-apt-repository -y ppa:ondrej/php
apt-get update
# Laravelの動作に必要なパッケージおよびsqliteをインストール
apt install -y php8.0 sqlite3 php8.0-bcmath php8.0-mbstring php8.0-xml php8.0-zip php8.0-sqlite

コマンド実行後、PHPとLaravel稼働用の各種パッケージが正常にインストールされていることを確認します。

$ php -v
PHP 8.0.10 (cli) (built: Aug 26 2021 15:50:07) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.10, Copyright (c), by Zend Technologies
$ php -m
[PHP Modules]
.
.
.
.
(長いので省略します)

② Composer のインストール・Laravel プロジェクトの作成

composerをインストールするために以下のコマンドを実行します。

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
sudo mv  composer.phar /usr/local/bin/composer

composerがインストールされていることを確認します。

$ composer -v 
 ______
  / ____/___  ____ ___  ____  ____  ________  _____
 / /   / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__  )  __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
                    /_/
Composer version 2.1.8 2021-09-15 13:55:14

続いて、Laravelプロジェクトを格納するディレクトリを作成してそのディレクトリ内でLaravelのプロジェクトを作成します。

$ mkdir /usr/local/project
  cd /usr/local/project
  composer create-project --prefer-dist laravel/laravel blog "6.*"

※ "6.*" のように数字を設定することで利用するLaravelのバージョンを指定することができます。

コマンド実行後、Laravelのプロジェクトが作業ディレクトリにできています。

f:id:Jazuma:20210921225644p:plain

Laravelプロジェクトのディレクトリに移動してサーバを起動します。

$ cd /usr/local/project/blog
  php artisan serve
Laravel development server started: http://127.0.0.1:8000
[Tue Sep 21 23:02:11 2021] PHP 8.0.10 Development Server (http://127.0.0.1:8000) started

URLにアクセスしてLaravelの初期画面が表示されれば環境構築は完了です。

f:id:Jazuma:20210921230355p:plain

2. LaravelでAPIを作成・動作確認

次にLaravelでAPIを作成します。 APIの要件は以下の通りです。

  1. タイトルと本文を投稿する(Create)
  2. 投稿一覧を表示する(Read)
  3. 指定したidの投稿を表示する(Read)
  4. 投稿を編集する(Update)
  5. 投稿を削除する(Delete)

では作業に移ります。

⑴ データベース設定

Laravelはデフォルトではmysqlを使用するように設定されていますが、今回はより手軽に使えるsqliteを使用します。

・ データベース用ファイルを作成

$ touch database/database.sqlite

・ 設定ファイルの変更

変更前

# Laravelのデフォルト設定
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=

変更後

DB_CONNECTION=sqlite

マイグレーションファイルの作成

テーブル作成用のマイグレーションファイルを作成します。

$  php artisan make:migration craete_posts_table

マイグレーションファイルを下記のように変更して、テーブルを作成します。

# 変更箇所のみ記載
public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->increments('id');
            $table->string('title');
            $table->string('content');
            $table->timestamps();
        });
    }
$ php artisan migration

コマンドを実行してエラーが表示されなければ成功です。

・ モデルクラス作成

続いてモデルクラスを作成します。 Laravelはモデルクラスにビジネスロジックを配置することが多いですが、今回はコードの量自体が少ないのでほとんど使いません。

$ php artisan make:model Post
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    // fillableに指定したプロパティは入力可能になる
    protected  $fillable = [
      'title',
      'content',
    ];
}

・ ルーティングの設定

Laravelのルーティングは`通常``route/web.phpに定義しますが、APIはroute/api.php```に定義します。 api.phpにルーティングを定義すると、URLのはじめに/apiが自動的につきます。 (例: '/hoge/fuga' と定義すると実際のエンドポイントは'/api/hoge/fuge' になります。)

APIのURL設計もサポートする親切さがLaravelの魅力の1つだと思いました。

Route::middleware(['middleware' => 'api'])->group(function () {
    # 投稿作成
    Route::post('/posts/create', 'PostController@create');
    # 投稿一覧表示
    Route::get('/posts', 'PostController@index');
    # 投稿表示
    Route::get('/posts/{id}', 'PostController@show');
    # 投稿編集
    Route::patch('/posts/update/{id}' , 'PostController@update');
    # 投稿削除
    Route::delete('/posts/{id}', 'PostController@delete');
});
   
※ Laravel8 ではこの記法が使えません。Laravel8で開発をする際はご注意ください。

このルーティングにより、

http://127.0.0.1:8000/api/posts へのGETリクエストはPostController に定義されているindex メソッドで処理

http://127.0.0.1:8000/api/posts/create へのPOSTリクエストはPostControllerに定義されているcreateメソッドで処理 されるようになります。

GETメソッドとPOSTメソッドは広く使われているHTTPメソッドですので特に説明は不要かと思います。

PATCHメソッドはリソースの一部を変更するためのメソッドです。

DELETEメソッドは読んで字のごとくリソースを削除するメソッドです。

PATCHメソッドやDELETEメソッドではなく、POSTメソッドで実装しても問題ありませんが、PATCHやDELETEを使用する方がそのリソースが何をするかが明確に なるのでより望ましいと思います。

ルーティングが設定できたので次はコントローラを作成します。

・ コントローラの作成

コントローラはViewからリクエストを受けてModelにデータを渡します。 まず、以下のコマンドでコントローラクラスを作成します。

php artisan make:controller PostController

PostContoroller.phpを以下のように変更します。

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class PostController extends Controller
{

 # 投稿作成
 public function create(Request $request)
 {
    $post = new Post();
    $post->title = $request->input('title');
    $post->content = $request->input('content');
    $post->created_at = now();
    $post->updated_at = now();
    $post->save();
    return response()->json(Post::all());
 }

    # 全件取得
  public function index()
  {
    $posts = Post::all();
    return response()->json($posts);
  }

  # 投稿表示
  public function show(Int $id)
  {
    $post = Post::find($id);
    return response()->json($post);
  }


  # 投稿編集
  public function update(Int $id, Request $request)
  {
    $post = Post::find($id);
    $post->title = $request->input('title');
    $post->content = $request->input('content');
    $post->updated_at = now();
    $post->save();
    return response()->json($post);
  }

  # 投稿削除
  public function delete(Int $id)
  {
    $post = Post::find($id)->delete();
    return response()->json(Post::all());
  }
}
create メソッド

LaravelがMVCモデルに準拠したフレームワークであるのを考えると、リクエストを受け取る・受け取ったデータをDBに保存するといった処理はモデルクラスやサービスクラスに記載すべきですが、今回はお試しということで直接コントローラクラスに書きます。

また、リクエストパラメータの入力値チェックやエラーハンドリングも今回は省略します。

リクエストで送られてきた投稿をPostテーブルに保存し、indexメソッドと同じように投稿一覧をjson形式で返します。 Laravelでjsonをリクエストを受け取る際には特に特別な下処理は必要ありません。

リクエストパラメータのContent-Typeヘッダを application/json と指定し、jsonを送ればinputメソッドでその値を取得することができます。

indexメソッド

投稿一覧をjson形式でレスポンスとして返します。 json()メソッドはLaravelで用意されているメソッドです。

引数に配列を渡すと自動的にjsonに変換してくれます。 (第二引数にレスポンスのステータスコードを、第三引数にContent-Typeヘッダを指定することもできます。省略した場合はそれぞれ200 , application/json がデフォルトでセットされます。)

show メソッド

Post::find() メソッドは引数に渡したidで投稿を検索します。 (idしか渡すことができないことに注意してください。 id以外のカラムで検索する際はwhere メソッドを使用します。)

update メソッド

findメソッドで変更対象の投稿を検索し、プロパティの値にリクエストパラメータを代入します。

delete メソッド

deleteメソッドで指定したリソースを削除します。 レスポンスをどのようなものにするかは選択の余地があると思いますが、今回は対象の投稿が正常に削除されたことを確認しやすいように 投稿一覧を返すようにします。

3. PostmanでLaravelで作成したAPIの動作確認

APIの動作確認を行います。 curlコマンドでLaravelのサーバにリクエストを送っても良いですがパラメータを指定するのがやや面倒です。 そこで、APIの動作確認ツールPostmanを使用します。

www.postman.com

Postmanを動かすまでの手順はこちらの記事に分かりやすく記載されています。

www.tairaengineer-note.com

試しにLaravelで作成した投稿作成APIにリクエストを送ってみます。

f:id:Jazuma:20210928012538p:plain

画像のようにHTTPメソッド・エンドポイント・リクエストパラメータを指定してSendボタンを押します。 レスポンスが正常に返ってきていれば成功です。

続いて先ほど作成した投稿を取得します。 投稿表示APIはGETメソッドでリクエストを送ります。

f:id:Jazuma:20210928013041p:plain

投稿が表示されています。

終わりに

今回はLaravelでWebAPIを作成しました。 フルスタックフレームワークというイメージの強いLaravelでしたが、WebAPIも特に苦心せず作成することができました。(APIの開発にLaravelを採用すべきなのかという問題はあると思いますが...)

個人的な感想としてはapi.phpにルーティングを定義することでURLに/apiを付与してくれる機能が良いと思いました。 Laravelのような高性能なフレームワークを使うと自然とセオリーに沿った設計になりやすいです。

皆さんもWebアプリケーションだけではなく、WebAPIの開発にもLaravel を利用してみてはいかがでしょうか。


  • エンジニア中途採用サイト
    ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
    ご興味ありましたら是非ご確認をお願いします。
    20210916153018
    https://career-recruit.rakus.co.jp/career_engineer/

  • カジュアル面談お申込みフォーム
    どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
    以下フォームよりお申込みください。
    forms.gle

  • イベント情報
    会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください! rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.