Symfony5.4 + kreait/firebase-bundleでFirebase emulatorを使ってみた

PHPでFirebase emulatorが使えない問題で頭を抱えていた方も多いかと思います。
ただそれは kreait/firebase-php のバージョンが6.2までの話です。
なんと気づいたら 6.3からはFirebase emulatorがサポートされていました。
(※全部コードリーディングしてませんが、少なくともAuth関連は対応していました。)
ということでSymfony5.4 + kreait/firebase-bundle + docker composeの対応をしてみたので、その作業ログを書きたいと思います。
最新のkreait/firebase-bundleに更新する
すでにfirebase-bundleが入っている場合は composerの w オプションつけて更新しましょう。
$ composer update kreait/firebase-php -w
Dockerfileを用意する
- ./docker/firebase/dockerfile
- ./docker/filrebase/firebase.json
を用意します
FROM node:16-alpine3.14
RUN apk update \
&& apk --no-cache add openjdk11-jre-headless \
&& rm -rf /var/cache/apk/*
COPY firebase.json ./
RUN npm install -g firebase-tools
{
"emulators": {
"auth": {
"port": 9099,
"host": "0.0.0.0"
},
"ui": {
"enabled": true,
"host": "0.0.0.0",
"port": 4000
}
}
}
今回はAuthしか使いませんが、必要な機能に応じてfirebase.jsonを変更すればいいかなと思います。
docker-compose.yamlの修正
firebase:
build:
context: ./docker/firebase/
dockerfile: Dockerfile
volumes:
- firebase-data:/opt/workspace:cached
ports:
- 9099:9099 *# Auth*
- 4000:4000 *# UI*
working_dir: /opt/workspace
command: “firebase emulators:start —import=/opt/workspace/data —export-on-exit —project your project name”
volumes:
firebase-data:
Symfony側でエミュレータに接続する
これは環境変数で切り替える事ができます。nodeのadmin sdkと同じです。
$ export FIREBASE_AUTH_EMULATOR_HOST=localhost:9099
で切り替えらえられるかと思います。
注意点
自分もドハマリしました。
https://twitter.com/polidog/status/1523854093995102208
kreait/firebase-bundleはcredentials.json(サービスアカウントの秘密鍵)が必要になります。
なのでFirebaseでプロジェクトを作る必要があるのと、そのプロジェクト名と firebase emulators:start 時に指定するプロジェクトIDを一致させる必要があります。
phpのランタイムをdockerで動かしている場合にemulatorか実際のFirebaseかを切り替える方法
自分の場合はenv_fileを指定して、環境変数を設定できるようにしています。
services:
php:
build:
context: ./docker/php/
dockerfile: Dockerfile
volumes:
- ./:/app:cached
depends_on:
- database
- firebase
env_file:
- .env.docker
.env.docker側に以下のように書いています。
FIREBASE_AUTH_EMULATOR_HOST=firebase:9099
これで作業するメンバーごとにエミュレータ or 実際のFirebaseに接続するかを簡単に切り替えることができます。
ただし値が反映されるタイミングがコンテナ起動時なので、.env.dockerの設定を変えたらコンテナを再起動する必要があります。
最後に
ついにPHPでもFirebase emulatorが使えるようになりました。
ぜひ皆さん試してみてください。