JJONG`sFACTORY
반응형
 

서론

이번에는 앱 관리를 위해서 Laravel에 Firebase realtime database를 연동해 보도록 하겠습니다.

먼저, 구글 계정으로 로그인 해 주신 뒤, 파이어베이스 프로젝트를 생성해 줍니다.

 

 

Firebase Setting

파이어베이스 프로젝트를 생성 후,

왼쪽 위에 톱니바퀴 아이콘을 클릭 해 주신 다음

프로젝트 설정 -> 서비스 계정 -> 서비스 계정 만들기를 클릭해 줍니다.

그러면, 새 비공개 키 생성 버튼이 활성화 되게 되는데, 해당 버튼을 클릭 후

키 생성 버튼을 눌러주셔서 json 파일을 다운로드 받아 주세요.

 

그 다음 Realtime Database를 생성해 줍니다.

왼쪽 메뉴에서 빌드->Realtime Database를 선택하여 데이터 베이스를 생성해 주세요.

잠금모드로 시작합니다.

 

그 다음 필요한 데이터를 일부 세팅해 줍니다.

Realtime database에서 규칙으로 들어가 규칙을 다음과같이 설정해 줍니다.

모든 디바이스에서 해당 값을 읽어줘야 하기 때문에 .read는 true로,

.write는 아래와 같이 수정해 주세요.

 

html
{ "rules": { ".read": true, ".write": "root.child('users').child(auth.uid).child('role').val() == 'admin'", } }

이제 Firebase 세팅은 완료 되었습니다.

Laravel과 Firebase를 연동하여 값을 읽고, 수정해 보도록 하겠습니다.

 

 

Laravel + Firebase 연동

먼저, laravel에 firebase를 연동하기 위해서는 sodium 을 확장해 줘야 합니다.

html
apt install php-sodium

window의 경우에는 php.ini extension 에서 sodium을 extension 해 줍시다!

 

그 후, kreait/laravel-firebase 를 composer를 이용하여 설치해 줍니다.

html
composer require kreait/laravel-firebase

만약 설치시 오류가 나온다면 composer.lock 파일을 삭제 후 시도해 주세요.

위 라이브러리의 자세한 내용은 아래 링크를 참조해 주세요.

 

GitHub - kreait/laravel-firebase: A Laravel package for the Firebase PHP Admin SDK

A Laravel package for the Firebase PHP Admin SDK. Contribute to kreait/laravel-firebase development by creating an account on GitHub.

github.com

 

config/app의 providers에 아래 내용을 추가해 줍니다!

<?php
// config/app.php
return [
    // ...
    'providers' => [
        // ...
        Kreait\Laravel\Firebase\ServiceProvider::class
    ]
    // ...
];

 

추가로, Realtime Database의 Document는 아래 링크를 참조해 주세요.

 

Realtime Database — Firebase Admin SDK for PHP Documentation

Docs » Realtime Database Edit on GitHub Realtime Database Note The Realtime Database API currently does not support realtime event listeners. Initializing the Realtime Database component With the SDK $database = $factory->createDatabase(); With Dependency

firebase-php.readthedocs.io

아까 파이어베이스에서 받은 json 파일을 storage 안에 저장해 준 뒤

그 후, env 파일에 아래와 같은 내용을 추가해 줍니다.

FIREBASE_CREDENTIALS=storage/json_file_path
FIREBASE_DATABASE_URL=https://[project-name]-default-rtdb.firebaseio.com

 

이제 파이어 베이스와 연동할 컨트롤러를 하나 생성해 줍니다.

php
php artisan make:controller Firebase/FirebaseController

 

FirebaseController 안쪽에 코드는 아래와 같이 작성해 보도록 하겠습니다.

 

<?php

namespace App\Http\Controllers\Firebase;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Kreait\Firebase\Contract\Database;
use Illuminate\Support\Facades\Validator;

class FirebaseController extends Controller
{
    public function __construct(Database $database)
    {
        $this->database = $database;
    }

    public function getDeviceFirebaseInfo($device) {
        if($device !== "android" && $device !== "ios") {
            $response = ["message" => "device value is only android or ios.", "code"=>400];
            return response($response, 400);
        }

        $reference = $this->database->getReference($device);
        return $reference->getValue();
    }

    // 완료
    public function setAppFirebaseInfo(Request $request) {
        $validator = [
            'device'=>'required|string',
            'key'=> 'required|string',
            'value'=>'required'
        ];
        $validatorCheck = Validator::make($request->all(), $validator);
        if($validatorCheck->fails()) {
            $response = ["message" => $validatorCheck->errors()->all(), "code"=>400];
            return response($response, 400);
        }

        if($request->device !== "android" && $request->device !== "ios") {
            $response = ["message" => "device value is only android or ios.", "code"=>400];
            return response($response, 400);
        }

        // 해당 디바이스에 해당 값 있는지 확인
        $reference = $this->database->getReference($request->device);
        $snapshot = $reference->getSnapshot();

        // 해당 키 값 있는지 확인
        if($snapshot->hasChild($request->key)) {
            $snapshot->getChild($request->key)->getReference()->set($request->value);
            return $reference->getValue();
        } else {
            return response(["message"=>"The ".$request->device." do not have ". $request->key.".", "code"=>400], 400);
        }
    }

}

 

라우트를 적절히 코딩하신 후, POSTMAN을 이용하여 확인해 보았습니다.

 

정상적으로 연동 되었음을 확인 하실 수 있습니다.

 

추가적으로, Firebase와의 연동테스트를 진행하기 위해서는 https 인증이 필요하기 때문에

php artisan serve로 서버를 실행시키면 테스트가 불가능 합니다.

 

반드시 xampp 등으로 서버를 세팅 해 주신 후에 테스트 진행 해 주세요!

반응형