Help us understand the problem. What is going on with this article?

Symfony4とAPI Platformを使って5分でAPIサーバを作る

More than 1 year has passed since last update.

API PlatformはオープンソースのAPIフレームワークです。Symfony上で動作し、ちょっとした設定で簡単にAPIサーバを構築することができます。ここではSymfony4とAPI PlatformでAPIサーバを構築する手順をご紹介します。タイトルの通り、サクッと5分ほどで構築できます。

1-2分:インストール

インストールはcomposerを利用します。APIサーバを構築するだけであればapiのみで必要なものは全てインストールできますが、ここでは動作確認用と作業効率向上のため、makerとserverを追加でインストールしています。

もろもろインストール
# Symfony4プロジェクトを作成
composer create-project symfony/skeleton symfony4-api-sample
cd symfony4-api-sample
# API Platformフレームワークインストール
composer req api
# Entityをコマンドラインから作成するためにmakerをインストール
composer req maker
# 動作確認用のサーバコマンドをインストール
composer req server --dev

3分:DB設定

今回はSQLiteを利用しました。ので、.envをちょっと修正します。

.env
###> doctrine/doctrine-bundle ###
# Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url
# For an SQLite database, use: "sqlite:///%kernel.project_dir%/var/data.db"
# Configure your db driver and server_version in config/packages/doctrine.yaml
- DATABASE_URL=mysql://db_user:db_password@127.0.0.1:3306/db_name
+ DATABASE_URL=sqlite:///%kernel.project_dir%/var/data.db
###< doctrine/doctrine-bundle ###

修正後、DBを作成します。

DB作成
bin/console doctrine:database:create

4分:Entity作成

今回はProductというEntityを作成しました。フィールドは

  • name(string)
  • price(integer)
  • isAvailable(bool)

を用意しました。

Entity作成
bin/console make:entity

 Class name of the entity to create or update (e.g. OrangeChef):
 > Product

 created: src/Entity/Product.php
 created: src/Repository/ProductRepository.php

 Next: When you're ready, create a migration with make:migration

作成したEntityにAnnotationを追加します。

Product.php
<?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;
+ use ApiPlatform\Core\Annotation\ApiResource;

/**
 * @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
+  * @ApiResource
 */
class Product
{

作成したEntityを利用してDBにテーブルを作成しましょう。

テーブル作成
bin/console doctrine:schema:create

5分:実行

これでProductのデータを制御するAPI群が完成しました。実際に動かしてみましょう。

サーバ起動
bin/console server:run

http://localhost:8000/api にアクセスすると…

1.png

できました!Productを制御するためのAPIのリストと利用方法を記載したページができあがりました。では、実際にAPIを実行してみましょう。ここでは登録とリスト取得を実行してみます。

curlで登録
curl --request POST \
  --url http://localhost:8000/api/products \
  --header 'accept: application/json' \
  --header 'content-type: application/json' \
  --data '{
    "name": "紅茶",
    "price": 450,
    "isAvailable": true
}'
response
{
    "id": 2,
    "name": "紅茶",
    "price": 450,
    "isAvailable": true
}

2.png

curlでリスト取得
curl --request GET \
  --url http://localhost:8000/api/products \
  --header 'accept: application/json'
response
[
    {
        "id": 1,
        "name": "コーヒー",
        "price": 320,
        "isAvailable": true
    },
    {
        "id": 2,
        "name": "紅茶",
        "price": 450,
        "isAvailable": true
    }
]

3.png

まとめ

こんな感じでサクッとAPIサーバが構築できます。設定などでOAuth2を仕込んだりバリデーションを設定したりなどカスタマイズできるので、ぜひ一度お試しください。ここまでのプロジェクトをGitHubに用意しましたので、こちらもご覧ください。

https://github.com/Ippey/symfony4-api-sample

ippey_s
大阪・枚方のフリーランスWebデベロッパー。主にSymfonyやLaravelなどのPHPフレームワークを使った開発やCraftCMSやWordPressなどのCMSを使ったサイト制作をしています。
https://unplat.info
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした