CakePHP3にFirebaseを導入してみた。

どうも。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も超絶初心者なのですが、参考になれば嬉しいです。ではでは〜

PHP ,
コメントは認証制です。詳しくは下記の注意をお読みください。お気軽にコメントお願いします!

Write a Comment

コメント時の注意

「Twitter」「Facebook」「Google+」「WordPress」のいずれかのアカウントをお持ちの方は各アカウントと連携することでコメントできます。 コメントしたことはSNSに流れませんので、アカウントをお持ちの方はこちらの方法でコメントを投稿して下さると嬉しいです。 アカウントをお持ちでない方はメールアドレスで投稿することができます。 初回コメント時は承認後に表示されます。