Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Symfony でサクッと作る REST API サーバー
Search
SAW
February 07, 2025
Programming
250
1
Share
Symfony でサクッと作る REST API サーバー
OSAKA ENGINEER NIGHT Vol.5 の発表資料です。
SAW
February 07, 2025
More Decks by SAW
See All by SAW
🪝 便利な Property Hooks を 使ってみよう 🪝
azuki
0
58
決済システム超初心者が Stripe に入門している話
azuki
0
96
React Hook Form と Zod によるフォームバリデーション
azuki
0
63
PHP で form-data を POST 以外のメソッドで受け取るには?
azuki
0
74
PHP で学ぶ OAuth 入門
azuki
2
1.2k
EditorConfig を使ってみよう
azuki
1
110
Vite の Library Mode を使って Vue のコンポーネントをライブラリ化する
azuki
1
370
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
410
Provide/Inject で TypeScript の恩恵を受ける方法
azuki
3
180
Other Decks in Programming
See All in Programming
実用!Hono RPC2026
yodaka
2
280
JOAI2026 1st solution - heron0519 -
heron0519
0
160
Claude CodeでETLジョブ実行テストを自動化してみた
yoshikikasama
0
1.1k
AIを導入する前にやるべきこと
negima
2
310
10 Tips of AWS ~Gen AI on AWS~
licux
5
510
Back to the roots of date
jinroq
0
570
Lightning-Fast Method Calls with Ruby 4.1 ZJIT / RubyKaigi 2026
k0kubun
3
1.9k
AI時代のエンジニアリングの原則 / Engineering Principles in the AI Era
haru860
0
880
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
300
Spec-driven Development: How AI Changes Everything (And Nothing)
simas
PRO
0
470
SREに優しいTerraform構成 modulesとstateの組み方
hiyanger
2
150
Claude Code × Gemini × Ebitengine ゲーム制作素人WebエンジニアがGoでゲームを作った話
webzawa
0
210
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
170
4 Signs Your Business is Dying
shpigford
187
22k
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
150
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
410
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
1.2k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
230
WCS-LA-2024
lcolladotor
0
560
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
250
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.5k
KATA
mclloyd
PRO
35
15k
Ruling the World: When Life Gets Gamed
codingconduct
0
220
Transcript
Symfony でサクッと作る REST API サーバー OSAKA ENGINEER NIGHT Vol.5 2025/02/07
SAW
$(whoami) 氏 名: 加藤 宗 一 郎 (30歳) ハンドルネーム: SAW
X (旧 Twitter): @azuki_eater 関 西 の IT エンジニア コミュニティの賑やかし担当 ( 自 称) 大 阪在住・愛知出 身 得意分野: Web アプリケーション開発 Laravel, Vue 2 「覚えるのが苦 手 」ではなく 「忘れるのが得意」と 言 い換えては どうだろうか? 今 日 の迷 言
Symfony とは PHP 製の Web アプリケーションフレームワーク OSS で開発されている Symofny 自
体をコンポーネントとして再利 用 も可能 Laravel は内部に Symfony を利 用 している 3
Symfony で開発するための準備
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 の補完機能のインストール例
Symfony プロジェクトの作成 Symfony CLI を使ってプロジェクトを作成 symfony new でプロジェクトを作成 Symfony CLI
でシステム要件を満たしているか確認可能 symfony check:requirements で要件を確認 6 # my-first-symfony の部分は # 自分のプロジェクト名を指定 symfony new my-first-symfony Symfony のプロジェクトの作成 symfony check:requirements Symfony のシステム要件のチェック
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 開発 用 サーバーの停 止
MakerBundler のインストール Symfony MakerBundle を使うと boilerplate からコードを 生 成可能 Laravel
の artisan の make コマンドのように利 用 できる symfony/maker-bundle をインストール 開発 用 ツールなので --dev オプションを追加 8 composer require --dev symfony/maker-bundle MakerBundle のインストール
小 さな API エンドポイントを作成
Controller の作成 Symfony CLI で Controller の boilerplate を作成 symfony
console make:controller で Controller クラスを作成 src/Controller 以下に Controller クラスの boilerplate を 自 動 生 成 10 symfony console make:controller ProductController Controller の作成
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 のメソッド内に記述
API の動作確認 localhost:8000/example にアクセス $this->json() の引数に渡した連想配列が JSON 形式で返却される 12 localhost:8000/example
に GET メソッドでアクセス レスポンスが JSON で返却されている
ね? 簡単でしょ?
データベースを利 用 した API の作成
開発 用 データベースの準備 ORM Pack Component をインストール Doctrine ORM がインストールされる
PostgreSQL の Docker コンテナの起動環境も 一 緒に 用 意される docker compose up -d で PostgreSQL のコンテナを起動 compose.yaml と .env の設定が追加される 15 composer require symfony/orm-pack ORM Pack Component のインストール
Entity の作成 Symfony CLI で Entity を作成 symfony console make:entity
で Entity と Repository クラスを作成 Entity の名前とフィールドを interactive に 入力 16 symfony console make:entity Entity の作成
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 メソッド
データベースへのマイグレーション Symfony CLI でマイグレーションファイルを作成 symfony console make:migration でマイグレーションファイルを 生 成
migrations ディレクトリ以下に 生 成される Symfony CLI でマイグレーションを実 行 symfony console doctrine:migrations:migrate でマイグレーションを実 行 18 # マイグレーションファイルの作成 symfony console make:entity # マイグレーションの実行 symfony console doctrine:migrations:migrate マイグレーションの実 行
データの登録と取得処理 EntityManagerInterface を利 用 してデータベースとやり取り データの取得系: getRepository() で取得した Repository のメソッドを利
用 findAll(), find(), findOneBy() など データの登録系: persist() と flush() で登録 persist() の引数には Entity のオブジェクトを設定 flush() で実際にデータベースに保存 19 $products = $entityManager // Repository の取得 ->getRepository(Product::class) ->findAll(); // まだデータベースには保存されていない $entityManager->persist($product); // ここでデータベースに保存される $entityManager->flush(); データベースからの取得処理 データベースへの保存処理
データの取得・登録処理の実装例 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() で実際にデータベースに保存
まとめ Symfony の環境構築 手 順を説明 最 小 限の API のエンドポイントの作成
方 法を紹介 データベースを利 用 した API の作成 方 法を紹介 21
ご清聴ありがとうございました
宣伝 その1 PHP カンファレンス名古屋2025 開催予定 日 付: 2025/02/22 ( 土
) 開催場所: ウインクあいち 11階 一 般参加チケット発売中 詳細は 公式サイト をご確認ください
宣伝 その2 PHP カンファレンス関 西 2025 開催予定 日 付: 2025/07/19
( 土 ) 開催場所: 神 戸 駅前研修センター 公式 X のアカウントのフォローよろしくお願いします!