【ITニュース解説】Building a Dynamic API in Symfony with Doctrine and MySQL
2025年09月24日に「Dev.to」が公開したITニュース「Building a Dynamic API in Symfony with Doctrine and MySQL」について初心者にもわかりやすく解説しています。
ITニュース概要
SymfonyでAPIを構築し、Doctrine ORMとMySQLでデータベースと連携させる方法を学ぶ。DB接続、エンティティ定義、マイグレーションでテーブルを作成。サンプルデータを登録し、APIがDBから取得したデータをフロントエンドに提供する手順を解説する。動的なAPI開発の基礎を習得できる。
ITニュース解説
この解説では、ウェブアプリケーション開発において非常に重要な「動的なAPI」の作り方を、人気のフレームワークであるSymfonyと、データベースを扱うためのDoctrine ORM、そして広く使われているデータベースであるMySQLを組み合わせて見ていく。システムエンジニアを目指す皆さんにとって、これは現実世界のアプリケーション開発でデータを扱いの基礎となる知識だ。
私たちがWebサイトやアプリを使うとき、裏側では常にさまざまな情報がやり取りされている。例えば、オンラインストアで商品リストを見たり、SNSで友達の投稿を読んだりする際、これらの情報は固定されたものではなく、常に変化し、更新されている。このような「リアルタイムで変化するデータ」をWebサイトやアプリに提供するために使われるのがAPI(Application Programming Interface)だ。特に、データベースと連携して動的にデータを供給するAPIは、現代のWebサービスにおいて不可欠な要素と言える。以前のブログ記事では、APIが固定のデータを返す例を紹介したが、今回はこれを一歩進め、本物のデータベースと接続し、そこに保存されたデータをAPIが提供できるようにする。
まず、SymfonyアプリケーションからMySQLデータベースに接続するための準備から始める。プロジェクトのルートディレクトリにある.envファイルを開き、「DATABASE_URL」という行を見つける。ここには、データベースの種類、ユーザー名、パスワード、接続先のアドレス、ポート番号、データベース名、そして文字エンコーディングなどの情報がまとめて書かれている。例えば、「mysql://root:root@127.0.0.1:3306/symfony-app?serverVersion=8.0.32&charset=utf8mb4」のような記述だ。この行に自分のMySQL環境に合わせた情報を設定することで、Symfonyはどのデータベースにアクセスすればよいかを理解する。セキュリティの観点から、パスワードのような機密情報は.env.localファイルに記述し、バージョン管理システムには含めないようにするのが一般的な方法だ。
次に、Symfonyとデータベースの橋渡し役となる「Doctrine ORM」を導入する。ORMとはObject Relational Mapper(オブジェクト関係マッピング)の略で、PHPで書かれた「オブジェクト」(後に説明するエンティティのこと)と、データベースの「テーブル」を結びつける仕組みのことだ。これにより、データベースを直接SQLで操作する代わりに、PHPのコードでデータベースのデータを扱えるようになる。composer require symfony/orm-packというコマンドを実行すると、Doctrine ORMとその関連ツールがプロジェクトにインストールされる。開発時にテスト用のデータを投入するためのdoctrine/doctrine-fixtures-bundleも同時にインストールしておくと便利だ。インストールが完了したら、php bin/console doctrine:database:createというコマンドを実行して、設定したデータベースが実際に作成されるか確認できる。これでデータベースへの接続準備は完了だ。
続いて、データベースのテーブルをPHPのオブジェクトとして定義する「エンティティ」を作成する。今回の例では、商品情報を扱うため、「Product」というエンティティを作る。これはデータベースのproductテーブルに対応し、id、title(商品名)、description(商品説明)、createdAt(作成日時)といった項目を持つ。php bin/console make:entityコマンドを実行し、対話形式でエンティティ名と各フィールド(項目)の情報を入力していくと、src/Entity/Product.phpというファイルが自動生成される。このファイルには、データベースのproductテーブルと各カラム(列)に対応するプロパティ(属性)が定義され、それぞれの値を取得・設定するためのメソッド(getter/setter)も含まれている。これで、PHPのコードから商品情報をオブジェクトとして扱えるようになる。
エンティティを定義しただけでは、まだ実際のデータベーステーブルは作成されていない。そこで登場するのが「マイグレーション」だ。マイグレーションは、エンティティの定義に基づいてデータベースのスキーマ(構造)を変更するための仕組みである。php bin/console make:migrationコマンドを実行すると、DoctrineはProductエンティティの定義と現在のデータベーススキーマを比較し、差分を解消するためのSQL文を含むマイグレーションファイルを生成する。このファイルには、productテーブルを作成するためのSQL文などが記述されている。このファイルを生成したら、次にphp bin/console doctrine:migrations:migrateコマンドを実行する。これにより、生成されたSQL文が実際にデータベースに対して実行され、productテーブルが作成される。MySQLにログインしてSHOW TABLES;やDESCRIBE product;といったコマンドを叩けば、テーブルが正しく作成されたことを確認できる。これで、Symfonyアプリケーションは、定義したテーブルにデータを保存したり、そこからデータを取得したりする準備が整った。
次に、作成したテーブルにサンプルデータを追加し、APIがそのデータを取得できるようにコントローラーを更新する。「フィクスチャ」は、開発やテストのためにデータベースにサンプルデータを投入する便利な方法だ。php bin/console make:fixturesコマンドを実行し、ProductFixturesという名前でフィクスチャクラスを作成する。このクラスのloadメソッドの中に、Productエンティティのオブジェクトを生成し、タイトルや説明を設定してデータベースに保存する処理を記述する。また、ProductエンティティのコンストラクタでcreatedAtフィールドが自動的に現在時刻で設定されるように修正することで、データを追加するたびに手動で日時を設定する手間を省くことができる。フィクスチャクラスを準備したら、php bin/console doctrine:fixtures:loadコマンドを実行することで、定義したサンプルデータがproductテーブルに一括で挿入される。これで、データベースにはいくつかの商品データが保存された状態になる。
最後に、APIコントローラーを修正し、ハードコードされた固定のデータではなく、データベースから実際のデータを取得するように変更する。src/Controller/Api/ProductApiController.phpファイルを開き、以前に固定のJSONデータを返していた部分を、Doctrine ORMを使ってProductエンティティのデータをすべて取得する処理に置き換える。具体的には、EntityManagerInterfaceというインターフェースをコントローラーのメソッドに注入し、それを使ってProductエンティティのリポジトリ(データ取得の窓口)を取得し、findAll()メソッドを呼び出すことで、データベースに保存されているすべての商品情報を取得する。取得したProductオブジェクトのリストをループ処理で回り、それぞれのタイトルと説明を取り出して配列に格納し、最終的にJSON形式で返すようにする。この変更を適用した後、Webブラウザでhttp://localhost:8000/api/productsにアクセスすると、データベースに保存された商品データがJSON形式で表示されるはずだ。
さらに、この動的なAPIがどのように活用されるかを確認するために、Reactのようなモダンなフロントエンドアプリケーションと連携させる。Reactアプリケーションは、SymfonyのAPIエンドポイント(http://localhost:8000/api/products)からデータを取得し、その内容をWebページ上に表示する。これにより、データベースに格納されたリアルタイムのデータが、SymfonyのAPIを経由してReactのユーザーインターフェースに表示されるまでの一連の流れを確認できる。
この一連の作業を通して、SymfonyとDoctrine ORM、MySQLを組み合わせることで、どのようにデータベースから動的なデータを取得し、APIとして提供するかの基礎を学ぶことができる。エンティティの定義、マイグレーションによるスキーマ管理、フィクスチャによるデータ投入、そしてAPIコントローラーでのデータ取得という流れは、堅牢で拡張性の高いWebアプリケーションを構築するための重要なステップとなる。ハードコードされたデータから実際のデータベースデータへと移行することで、皆さんのAPIは単なるデモから、現実世界で使える生産性の高いシステムへと進化する。これは、システムエンジニアとしてのキャリアにおいて、Webサービスのバックエンドを理解し、構築するための強力な基盤となるだろう。Symfonyは、世界中の60万人以上の開発者が信頼して使っており、Doctrine ORMも10億回以上ダウンロードされている実績がある。MySQLだけでなく、PostgreSQLやSQLiteなど多様なデータベースに対応しており、PHPコード内で直接クエリを記述できるため、開発効率も高い。