Slide 1

Slide 1 text

Symfony でサクッと作る REST API サーバー OSAKA ENGINEER NIGHT Vol.5 2025/02/07 SAW

Slide 2

Slide 2 text

$(whoami) 氏 名: 加藤 宗 一 郎 (30歳) ハンドルネーム: SAW X (旧 Twitter): @azuki_eater 関 西 の IT エンジニア コミュニティの賑やかし担当 ( 自 称) 大 阪在住・愛知出 身 得意分野: Web アプリケーション開発 Laravel, Vue 2 「覚えるのが苦 手 」ではなく 「忘れるのが得意」と 言 い換えては どうだろうか? 今 日 の迷 言

Slide 3

Slide 3 text

Symfony とは PHP 製の Web アプリケーションフレームワーク OSS で開発されている Symofny 自 体をコンポーネントとして再利 用 も可能 Laravel は内部に Symfony を利 用 している 3

Slide 4

Slide 4 text

Symfony で開発するための準備

Slide 5

Slide 5 text

Symfony CLI のインストール Symfony の開発ツール (GitHub: symfony-cli/symfony-cli) Symfony のプロジェクトや boilerplate などを作成 Symfony の開発 用 サーバーを起動 Symfony CLI の補完機能もインストール 前提: Symfony CLI がインストール済み symfony completion --help でインストール 方 法を確認可能 5 symfony self:completion zsh \ | sudo tee $fpath[1]/_symfony brew install symfony-cli/tap/symfony-cli Symfony CLI のインストール (macOS の例) Symfony CLI の補完機能のインストール例

Slide 6

Slide 6 text

Symfony プロジェクトの作成 Symfony CLI を使ってプロジェクトを作成 symfony new でプロジェクトを作成 Symfony CLI でシステム要件を満たしているか確認可能 symfony check:requirements で要件を確認 6 # my-first-symfony の部分は # 自分のプロジェクト名を指定 symfony new my-first-symfony Symfony のプロジェクトの作成 symfony check:requirements Symfony のシステム要件のチェック

Slide 7

Slide 7 text

Symfony の開発 用 サーバーの起動 Symfony CLI で開発 用 サーバーを起動 前提: Symfony のプロジェクトディレクトリに移動済み symfony server:start で開発 用 サーバーを起動 -d オプションでバックグラウンドで起動 localhost:8000 でアクセス可能 symfony server:stop でバックグラウンドのサーバを停 止 7 cd my-first-symfony symfony server:start -d 開発 用 サーバーの起動 symfony server:stop 開発 用 サーバーの停 止

Slide 8

Slide 8 text

MakerBundler のインストール Symfony MakerBundle を使うと boilerplate からコードを 生 成可能 Laravel の artisan の make コマンドのように利 用 できる symfony/maker-bundle をインストール 開発 用 ツールなので --dev オプションを追加 8 composer require --dev symfony/maker-bundle MakerBundle のインストール

Slide 9

Slide 9 text

小 さな API エンドポイントを作成

Slide 10

Slide 10 text

Controller の作成 Symfony CLI で Controller の boilerplate を作成 symfony console make:controller で Controller クラスを作成 src/Controller 以下に Controller クラスの boilerplate を 自 動 生 成 10 symfony console make:controller ProductController Controller の作成

Slide 11

Slide 11 text

Controller の概要 11 namespace App\Controller; final class ProductController extends AbstractController { #[Route(path: '/example', methods: ['GET'])] public function example(): JsonResponse { return $this->json([ 'message' => 'Hello, Symfony World!', ]); } } #[Route] で Controller のメソッドと URL を 対応付け path: URL のパスを指定 methods: HTTP メソッドを指定 API を呼び出された際に実 行 する処理を Controller のメソッド内に記述

Slide 12

Slide 12 text

API の動作確認 localhost:8000/example にアクセス $this->json() の引数に渡した連想配列が JSON 形式で返却される 12 localhost:8000/example に GET メソッドでアクセス レスポンスが JSON で返却されている

Slide 13

Slide 13 text

ね? 簡単でしょ?

Slide 14

Slide 14 text

データベースを利 用 した API の作成

Slide 15

Slide 15 text

開発 用 データベースの準備 ORM Pack Component をインストール Doctrine ORM がインストールされる PostgreSQL の Docker コンテナの起動環境も 一 緒に 用 意される docker compose up -d で PostgreSQL のコンテナを起動 compose.yaml と .env の設定が追加される 15 composer require symfony/orm-pack ORM Pack Component のインストール

Slide 16

Slide 16 text

Entity の作成 Symfony CLI で Entity を作成 symfony console make:entity で Entity と Repository クラスを作成 Entity の名前とフィールドを interactive に 入力 16 symfony console make:entity Entity の作成

Slide 17

Slide 17 text

Entity の概要 17 namespace App\Entity; #[ORM\Entity(repositoryClass: ProductRepository::class)] class Product { #[ORM\Column(length: 255)] private ?string $name = null; public function getName(): ?string { return $this->name; } public function setName(string $name): static { $this->name = $name; return $this; } } Entity のプロパティ #[ORM\Column] でテーブルのカラムと対応 Entity の getter と setter メソッド

Slide 18

Slide 18 text

データベースへのマイグレーション Symfony CLI でマイグレーションファイルを作成 symfony console make:migration でマイグレーションファイルを 生 成 migrations ディレクトリ以下に 生 成される Symfony CLI でマイグレーションを実 行 symfony console doctrine:migrations:migrate でマイグレーションを実 行 18 # マイグレーションファイルの作成 symfony console make:entity # マイグレーションの実行 symfony console doctrine:migrations:migrate マイグレーションの実 行

Slide 19

Slide 19 text

データの登録と取得処理 EntityManagerInterface を利 用 してデータベースとやり取り データの取得系: getRepository() で取得した Repository のメソッドを利 用 findAll(), find(), findOneBy() など データの登録系: persist() と flush() で登録 persist() の引数には Entity のオブジェクトを設定 flush() で実際にデータベースに保存 19 $products = $entityManager // Repository の取得 ->getRepository(Product::class) ->findAll(); // まだデータベースには保存されていない $entityManager->persist($product); // ここでデータベースに保存される $entityManager->flush(); データベースからの取得処理 データベースへの保存処理

Slide 20

Slide 20 text

データの取得・登録処理の実装例 20 final class ProductController extends AbstractController { public function __construct(private EntityManagerInterface $entityManager) { } #[Route(path: '/api/products', methods: ['GET'])] public function list(): JsonResponse { $products = $this->entityManager->getRepository(Product::class)->findAll(); return $this->json($products); } #[Route(path: '/api/products', methods: ['POST'])] public function create(): JsonResponse { $product = new Product(); $product->setName('hoge'); // まだデータベースには保存されていない $this->entityManager->persist($product); // ここでデータベースに保存される $this->entityManager->flush(); return $this->json($product); } } Repsitory を取得して findAll() で product テーブルを全件取得 persist() で保存したいデータを指定 flush() で実際にデータベースに保存

Slide 21

Slide 21 text

まとめ Symfony の環境構築 手 順を説明 最 小 限の API のエンドポイントの作成 方 法を紹介 データベースを利 用 した API の作成 方 法を紹介 21

Slide 22

Slide 22 text

ご清聴ありがとうございました

Slide 23

Slide 23 text

宣伝 その1 PHP カンファレンス名古屋2025 開催予定 日 付: 2025/02/22 ( 土 ) 開催場所: ウインクあいち 11階 一 般参加チケット発売中 詳細は 公式サイト をご確認ください

Slide 24

Slide 24 text

宣伝 その2 PHP カンファレンス関 西 2025 開催予定 日 付: 2025/07/19 ( 土 ) 開催場所: 神 戸 駅前研修センター 公式 X のアカウントのフォローよろしくお願いします!