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
81
Symfony でサクッと作る REST API サーバー
OSAKA ENGINEER NIGHT Vol.5 の発表資料です。
SAW
February 07, 2025
Tweet
Share
More Decks by SAW
See All by SAW
PHP で学ぶ OAuth 入門
azuki
1
210
EditorConfig を使ってみよう
azuki
1
56
Vite の Library Mode を使って Vue のコンポーネントをライブラリ化する
azuki
1
120
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
230
Provide/Inject で TypeScript の恩恵を受ける方法
azuki
3
120
GraphQL はいいぞ! ~Laravel で学ぶ GraphQL 入門~
azuki
1
330
OSS contributor への第一歩を踏み出すまでの物語
azuki
2
270
Eloquent で relation を扱う基礎
azuki
0
140
メイキング・オブ・PHPカンファレンス 〜PHPカンファレンス関西2024の運営スタッフが語る舞台裏〜
azuki
0
120
Other Decks in Programming
See All in Programming
Java 24まとめ / Java 24 summary
kishida
3
500
Defying Front-End Inertia: Inertia.js on Rails
skryukov
0
490
Agentic Applications with Symfony
el_stoffel
2
310
複雑なフォームの jotai 設計 / Designing jotai(state) for Complex Forms #layerx_frontend
izumin5210
4
1.1k
Ruby's Line Breaks
yui_knk
2
1.2k
VitestのIn-Source Testingが便利
taro28
6
2.1k
[NG India] Event-Based State Management with NgRx SignalStore
markostanimirovic
1
160
AI Coding Agent Enablement - エージェントを自走させよう
yukukotani
14
6.2k
AIコーディングワークフローの試行 〜AIエージェント×ワークフローでの自動化を目指して〜
rkaga
3
3.7k
「”誤った使い方をすることが困難”な設計」で良いコードの基礎を固めよう / phpcon-odawara-2025
taniguhey
0
160
リアルタイムレイトレーシング + ニューラルレンダリング簡単紹介 / Real-Time Ray Tracing & Neural Rendering: A Quick Introduction (2025)
shocker_0x15
1
310
Dissecting and Reconstructing Ruby Syntactic Structures
ydah
1
750
Featured
See All Featured
Embracing the Ebb and Flow
colly
85
4.6k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Done Done
chrislema
183
16k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
5
560
Become a Pro
speakerdeck
PRO
27
5.3k
Designing Experiences People Love
moore
141
24k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.2k
Optimising Largest Contentful Paint
csswizardry
36
3.2k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.5k
Building Adaptive Systems
keathley
41
2.5k
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 のアカウントのフォローよろしくお願いします!