polidog lab

Top About Rss
2022年05月11日

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

で切り替えらえられるかと思います。

注意点

自分もドハマリしました。

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が使えるようになりました。
ぜひ皆さん試してみてください。

comments powered by Disqus