こんにちは この記事ではLaravelの環境構築を行い、ごくシンプルなWebAPIを作成します。
Larevelはバックエンドのロジックから画面の描画まで行うことができますが、今回は画面の開発は行わずAPIの開発のみを行います。 バックエンドをAPIとして開発することで、外部アプリケーションと連携することができる・ フロントエンドと疎結合になり保守性が高くなる・フロントエンドと並行して開発することができるといった恩恵を享受することができます。
LaravelはMVCモデルに準じたフレームワークですが、APIを開発する際は画面(View)が不要になります。したがってこの記事ではModelとControllerのみを作成します。
環境・MWのバージョン
※ 2021年9月現在Laravelはバージョン8系までリリースされていますが、LTSはバージョン6系です。また、リリースから一定期間が経過しており動作が安定している・ 日本語情報が充実しているというメリットがあるのでLaravel 6系を採用しています。
作業手順
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のプロジェクトが作業ディレクトリにできています。
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の初期画面が表示されれば環境構築は完了です。
2. LaravelでAPIを作成・動作確認
次にLaravelでAPIを作成します。 APIの要件は以下の通りです。
- タイトルと本文を投稿する(Create)
- 投稿一覧を表示する(Read)
- 指定したidの投稿を表示する(Read)
- 投稿を編集する(Update)
- 投稿を削除する(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を使用します。
Postmanを動かすまでの手順はこちらの記事に分かりやすく記載されています。
試しにLaravelで作成した投稿作成APIにリクエストを送ってみます。
画像のようにHTTPメソッド・エンドポイント・リクエストパラメータを指定してSendボタンを押します。 レスポンスが正常に返ってきていれば成功です。
続いて先ほど作成した投稿を取得します。 投稿表示APIはGETメソッドでリクエストを送ります。
投稿が表示されています。
終わりに
今回はLaravelでWebAPIを作成しました。 フルスタックフレームワークというイメージの強いLaravelでしたが、WebAPIも特に苦心せず作成することができました。(APIの開発にLaravelを採用すべきなのかという問題はあると思いますが...)
個人的な感想としてはapi.phpにルーティングを定義することでURLに/apiを付与してくれる機能が良いと思いました。 Laravelのような高性能なフレームワークを使うと自然とセオリーに沿った設計になりやすいです。
皆さんもWebアプリケーションだけではなく、WebAPIの開発にもLaravel を利用してみてはいかがでしょうか。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comラクスDevelopers登録フォーム
https://career-recruit.rakus.co.jp/career_engineer/form_rakusdev/イベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
◆TECH PLAY
techplay.jp
◆connpass
rakus.connpass.com