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
1
220
Symfony でサクッと作る REST API サーバー
OSAKA ENGINEER NIGHT Vol.5 の発表資料です。
SAW
February 07, 2025
Tweet
Share
More Decks by SAW
See All by SAW
React Hook Form と Zod によるフォームバリデーション
azuki
0
29
PHP で form-data を POST 以外のメソッドで受け取るには?
azuki
0
49
PHP で学ぶ OAuth 入門
azuki
2
950
EditorConfig を使ってみよう
azuki
1
92
Vite の Library Mode を使って Vue のコンポーネントをライブラリ化する
azuki
1
300
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
370
Provide/Inject で TypeScript の恩恵を受ける方法
azuki
3
160
GraphQL はいいぞ! ~Laravel で学ぶ GraphQL 入門~
azuki
1
390
OSS contributor への第一歩を踏み出すまでの物語
azuki
2
350
Other Decks in Programming
See All in Programming
CSC307 Lecture 03
javiergs
PRO
1
470
ゆくKotlin くるRust
exoego
1
200
PC-6001でPSG曲を鳴らすまでを全部NetBSD上の Makefile に押し込んでみた / osc2025hiroshima
tsutsui
0
210
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
170
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
0
1.9k
[AI Engineering Summit Tokyo 2025] LLMは計画業務のゲームチェンジャーか? 最適化業務における活⽤の可能性と限界
terryu16
2
290
ThorVG Viewer In VS Code
nors
0
660
HTTPプロトコル正しく理解していますか? 〜かわいい猫と共に学ぼう。ฅ^•ω•^ฅ ニャ〜
hekuchan
2
630
Spinner 軸ズレ現象を調べたらレンダリング深淵に飲まれた #レバテックMeetup
bengo4com
1
210
Denoのセキュリティに関する仕組みの紹介 (toranoana.deno #23)
uki00a
0
220
生成AI時代を勝ち抜くエンジニア組織マネジメント
coconala_engineer
0
39k
React 19でつくる「気持ちいいUI」- 楽観的UIのすすめ
himorishige
11
5.1k
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Utilizing Notion as your number one productivity tool
mfonobong
2
200
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
130
Deep Space Network (abreviated)
tonyrice
0
33
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
2.8k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.5k
BBQ
matthewcrist
89
10k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
1
890
We Have a Design System, Now What?
morganepeng
54
8k
Navigating the moral maze — ethical principles for Al-driven product design
skipperchong
1
220
Documentation Writing (for coders)
carmenintech
77
5.2k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
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 のアカウントのフォローよろしくお願いします!