うるおいらんど

CakePHP3にFirebaseを導入してみた。

CakePHPFirebase

どうも。CakePHPを初めて3日目のReoです。

FirebaseをCakePHPで使ってみようと思って調べてみると、意外にも全然ヒットしませんでした。なので手順を残しておこうと思います。

でも、ヒットしないってことはそもそもCakePHPでFirebaseを使うってのは悪手なのか?!って思わないこともないので、そういう意見があれば是非お聞かせください。

 

環境

今回導入してみた環境は、

  • CakePHP 3.6.10
  • CentOS 7.3
  • PHP 7.2.9

です。

この環境構築自体は「Cakephp3 + CentOS7 + Vagrant + Apache + MySQL 環境セットアップ」の記事を見て構築しました。

あとはvagrant-hostupdaterを使ってvagtrantwork.comでアクセスできるようにしています。

 

Firebaseの方は「GitHub - kreait/firebase-php: Firebase Admin PHP SDK」を用いています。

実装はほぼ「 Firebase Admin SDK for PHP Documentation」のままです。

英語は読むのに労力がいるので、メモするぜ!っていうわけです。

 

Firebaseで新規プロジェクトを作成する

Firebaseにログインし、プロジェクトを作成します。

公式ドキュメントの「アプリにFirebaseを追加する」の通りに操作し、まずは「プロジェクト名-firebase-adminsdk-hogehoge.json」というJSON形式のファイルをゲットします。

 

これを適当に「firebase_credentials.json」という名前に変更して、CakePHP内の非公開リポジトリにぶちこみます。

自分はとりあえず アプリケーションフォルダの直下にfirebaseというディレクトリを作り、その中にいれました。これをちゃんと非公開ディレクトリにしておかないとなのですが、その部分は割愛。

 

SDKを導入する

次に、SDKを導入します。GitHub - kreait/firebase-php: Firebase Admin PHP SDKですね。

アプリケーションフォルダ直下のcomposer.json内に以下を追記します。

    "require": {
         // require内に追記
        "kreait/firebase-php": "^4.0"
    },

そいで、vagrant sshで接続し、composer updateします。

vagrant ssh
cd /var/www/html/アプリ名
composer update

composer.lock内にkreaitが入っていればおkです。

これで導入はおkのはずです!

 

動作確認をしてみよう!

まずは使ってみましょう。

適当にsrc/Controller内に新しくHogeController.phpを追加します。

そしてFirebaseを使えるようにします。

<?php 
namespace App\Controller;

use Kreait\Firebase\Factory;
use Kreait\Firebase\ServiceAccount;

class HogeController extends AppController {
    public function initialize() { 
        $this->autoRender = false;  // viewを用意しないで動かしたい
    }

    public function index() {
    }
}

viewを用意するのが面倒なので、とりあえずautoRenderをfalseにしておきます。

 

この状態で ドメイン/アプリ名/hoge(vagrantwork.com/test-fb/hoge等) にアクセスしてみて、エラーが出てなければcomposerでの導入は上手くいっているはずです。

エラーが出るようならcomposer.lockにkreaitが上手く入っているかどうかのチェックをすると良いと思います。

 

次に、DBの取得をしてエラーが出ないかの確認をします。

    public function initialize() {
        $this->autoRender = false;  // viewを用意しないで動かしたい
        
        $serviceAccount = ServiceAccount::fromJsonFile( ROOT . '/firebase/firebase_credentials.json' );

        $firebase = (new Factory)->withServiceAccount($serviceAccount)->create();
        $firebase = (new Factory)
            ->withServiceAccount($serviceAccount)
            ->withDatabaseUri('https://プロジェクト名.firebaseio.com')  // Firebase側でつけたプロジェクト名
            ->create();

        $database = $firebase->getDatabase();

    }

 

4行目のServiceAccount::fromJsonFileは、最初にFirebaseからダウンロードして配置したJSONファイルまでのパスを書いてください。

9行目の部分はFirebase側でつけたプロジェクト名を書いてください。

 

これでもう一度アクセスしてみて、エラーが出てなければおkです。上手くいかない場合はおそらくJSONファイルまでのパスがおかしいのだと思われます。

 

あとは実際にデータを飛ばして確認してみます。

class HogeController extends AppController {

    public $dbData = [];

    public function initialize() {
        $this->autoRender = false;  // viewを用意しないで動かしたい
        
        $serviceAccount = ServiceAccount::fromJsonFile(ROOT . '/firebase/firebase_credentials.json');

        $firebase = (new Factory)->withServiceAccount($serviceAccount)->create();
        $firebase = (new Factory)
            ->withServiceAccount($serviceAccount)
            ->withDatabaseUri('https://プロジェクト名.firebaseio.com')
            ->create();

        $database = $firebase->getDatabase();

        // 適当に飛ばしてテストしてみるよ
        $newPost = $database
            ->getReference('blog/posts')
            ->push([
                'title' => 'タイトル',
                'body' => 'ここに内容を適当に書いておくよ。テストだよ。'
            ]);

        $this->dbData['key'] = $newPost->getKey();
        $this->dbData['uri'] = $newPost->getUri();

        $newPost->getChild('title')->set('NEWタイトル');
        
        $this->dbData['value'] = $newPost->getValue(); // リアルタイムDBからフェッチ
        $newPost->remove(); // 削除しておく
    }

    public function index() {
        echo 'Key: ' . $this->dbData['key'];
        echo 'URI: ' . $this->dbData['uri'];
        var_dump($this->dbData['value'])  // 配列が入っているはず;
    }
}

一度DBにポストして、そのデータを書き換えて、最後にリムーブしています。 途中書き換えたデータを拾って、変数に入れておき、出力しています。

 

これで出力結果にNEWタイトルが含まれていればうまくいっているはずです。

 

終わりに

はい、これで一応Firebaseの導入自体はできました。

この記事自体ドキュメントのまんまといえばまんまです。(ドキュメントはcakephpではないけれど)

なので、あとは「 Firebase Admin SDK for PHP Documentation」を参照していただければと思います。

ドキュメント通りにやって何かハマることがあれば、また随時記事にしようと思います。

 

CakePHPもFirebaseも超絶初心者なのですが、参考になれば嬉しいです。ではでは〜

参考リンク

Comments

コメントはありません。

現在コメントフォームは工事中です。