Nasser Ali Karimi
Nasser Ali Karimi

Reputation: 4663

Laravel and Firebase real time database connection

I want to connect laravel project with firebase. I do this:

  1. install this package form github https://github.com/mpociot/laravel-firebase-sync
  2. configure config/services.php

    'firebase' => [
       'api_key' => 'AIzaSyDrioEmJqa6Ir9ocpl0UuA3No', // Only used for JS integration
       'auth_domain' => 'bum.firebaseapp.com', // Only used for JS integration
       'database_url' => 'https://8c5c.firebaseio.com',
       'secret' => '8wjs4WLjJ5hQ4lsCoUXUWiaJ3RIX',
       'storage_bucket' => 'STORAGE_BUCKET', // Only used for JS integration
    ],
    

I want to get data form firebase DB but when i run this command on thinker

App\Users::first();

I got this error

Illuminate\Database\QueryException with message 'SQLSTATE[HY000] [2002] No connection could be made because the target machin e actively refused it. (SQL: select * from users limit 1)'

Also this is my users model

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Mpociot\Firebase\SyncsWithFirebase;

class Users extends Model
{

    use SyncsWithFirebase;

    protected $table = 'users';
}

Do you guide me?

Upvotes: 0

Views: 4893

Answers (4)

aakash rajput
aakash rajput

Reputation: 131

Here is the code which i use to perform all tasks with realtime firebase

class HomeController extends Controller
{
    private $FIREBASE_DB_URL;
    private $FIREBASE_JSON;
    private $FIREBASE;
    private $FACTORY;

    public function __construct()
    {
        $this->middleware('auth');
        $this->FIREBASE_DB_URL  =   env("FIREBASE_DB_URL");
        $this->FIREBASE_JSON    =   getcwd(). DIRECTORY_SEPARATOR .'assets'.DIRECTORY_SEPARATOR.'tapmap-firebase.json';
        $this->FIREBASE = (new Factory)->withServiceAccount($this->FIREBASE_JSON )->withDatabaseUri($this->FIREBASE_DB_URL)->createDatabase();
        $this->FACTORY = (new Factory)->withServiceAccount($this->FIREBASE_JSON);
    }

    public function index()
    {
        $data = $this->FIREBASE->getReference('/')->getValue();
        //render to blade file
        return view('index',['users'=>$data]);
    }
    public function store(Request $request)
    {
        $this->validate($request,[
            'title'=>'required',
            'lat'=>'required',
            'lng'=>'required'
        ]);

        $lastId = 1;
        if($request->lastId != null)
        {
            $lastId = $request->lastId;
        }
        // Save data to firebase without image
        if(!$request->hasFile('pic'))
        {
            $this->FIREBASE->getReference('/'.$lastId)->set([
                "title" => $request->title == '' ? '' : $request->title,
                "address" => $request->address == '' ? '' : $request->address,
                "description" => $request->description == '' ? '' : $request->description,
                "phone" => $request->phone == '' ? '' : $request->phone,
                "available_unavailable" => $request->available_unavailable == '' ? '' : $request->available_unavailable,
                "indoor_outdoor" => $request->indoor_outdoor == '' ? '' : $request->indoor_outdoor,
                "self_ask_a_member" => $request->self_ask_a_member == '' ? '' : $request->self_ask_a_member,
                "lat" => $request->lat == '' ? '' : $request->lat,
                "lng" => $request->lng == '' ? '' : $request->lng,
                "pic" => "",
            ]);
        }else{
            $storage = $this->FACTORY->createStorage();
            $image = $request->file('pic');

            $localfolder = public_path('firebase-images') .'/';
            $extension  = $image->getClientOriginalExtension();

            $file = $lastId. '.' . $extension;
            $image_url = '';

            // Upload image to firebase storage
            if ($image->move($localfolder, $file)) {
                $uploadedfile = fopen($localfolder.$file, 'r');
                $image_url_object = $storage->getBucket()->upload($uploadedfile, [
                    'name' => 'tapImages/'.$file,
                ]);
                unlink($localfolder . $file);

                $expiresAt = new \DateTime('3100-01-01');

                $image_url = $image_url_object->signedUrl($expiresAt);
            }

            $this->FIREBASE->getReference('/'.$lastId)->set([
                "title" => $request->title,
                "address" => $request->address,
                "description" => $request->description,
                "phone" => $request->phone,
                "available_unavailable" => $request->available_unavailable,
                "indoor_outdoor" => $request->indoor_outdoor,
                "self_ask_a_member" => $request->self_ask_a_member,
                "lat" => $request->lat,
                "lng" => $request->lng,
                "pic" => $image_url,
            ]);
        }

        return back();
    }

    // Update post record
    public function update(Request $request)
    {
        $this->validate($request,[
            'title'=>'required',
            'lat'=>'required',
            'lng'=>'required'
        ]);

        if($request->updateID == '' || $request->updateID == null)
        {
            return back()->with('failed','Something went wrong');
        }

        if(!$request->hasFile('update-image')){

            $this->FIREBASE->getReference('/'.$request->updateID)->set([
                "title" => $request->title,
                "address" => $request->address,
                "description" => $request->description,
                "phone" => $request->phone,
                "available_unavailable" => $request->available_unavailable,
                "indoor_outdoor" => $request->indoor_outdoor,
                "self_ask_a_member" => $request->self_ask_a_member,
                "lat" => $request->lat,
                "lng" => $request->lng,
                "pic" => $request->prev_user_pic == '' ? '' : $request->prev_user_pic,
            ]);
        }else{
            $storage = $this->FACTORY->createStorage();

            if($request->prev_user_pic != '')
            {
                $var = explode('/', $request->prev_user_pic);
                $key = array_search('tapImages', $var);
                $string = $var[$key+1];
                $file_name =  strtok($string, '?');
                $imageReference = $storage->getBucket()->object("tapImages/".$file_name);
                if($imageReference->exists())
                    $imageReference->delete();
            }

            $image = $request->file('update-image');
            $localfolder = public_path('firebase-images') .'/';
            $extension  = $image->getClientOriginalExtension();

            $file = $request->updateID. '.' . $extension;
            $image_url = '';

            if ($image->move($localfolder, $file)) {
                $uploadedfile = fopen($localfolder.$file, 'r');
                $image_url_object = $storage->getBucket()->upload($uploadedfile, [
                    'name' => 'tapImages/'.$file,
                ]);
                unlink($localfolder . $file);

                $expiresAt = new \DateTime('3100-01-01');

                $image_url = $image_url_object->signedUrl($expiresAt);
            }

            $this->FIREBASE->getReference('/'.$request->updateID)->set([
                "title" => $request->title,
                "address" => $request->address,
                "description" => $request->description,
                "phone" => $request->phone,
                "available_unavailable" => $request->available_unavailable,
                "indoor_outdoor" => $request->indoor_outdoor,
                "self_ask_a_member" => $request->self_ask_a_member,
                "lat" => $request->lat,
                "lng" => $request->lng,
                "pic" => $image_url,
            ]);
        }
        return back();
    }

    public function destroy(Request $request)
    {
        $factory = (new Factory)->withServiceAccount($this->FIREBASE_JSON);
        $storage = $factory->createStorage();

        $key = $request->id;
        if($key == '' || $key == null)
        {
            return back()->with('failed','Record id does not exists');
        }

        // Delete the image of post
        $post = $this->FIREBASE->getReference('/'.$key)->getValue();

        if($post['pic'] != '')
        {
            $var = explode('/', $post['pic']);
            $key_arr = array_search('tapImages', $var);
            $string = $var[$key_arr+1];
            $file_name =  strtok($string, '?');
            $imageReference = $storage->getBucket()->object("tapImages/".$file_name);
            if($imageReference->exists())
                $imageReference->delete();
        }


        // Delete post
        if($this->FIREBASE->getReference('/'.$key)->remove())
        {
            return back()->with('success','Post removed successfully');
        }
        else
        {
            return back()->with('failed','Something went wrong!');
        }
    }

    public function show($id)
    {
        // send post details with the help of id
        $firebase = (new Factory)
        ->withServiceAccount($this->FIREBASE_JSON )
        ->withDatabaseUri($this->FIREBASE_DB_URL)
        ->createDatabase();

        $data = $firebase->getReference('/'.$id)->getValue();

        return $data;
    }
}

Upvotes: 0

aakash rajput
aakash rajput

Reputation: 131

If you want to fetch all data from the database then you can use this code.

Here $this->FIREBASE_JSON is the unique private key and $this->FIRE_DB_URL is the URL of your database and these are initialized in the constructor.

$firebase = (new Factory)
        ->withServiceAccount($this->FIREBASE_JSON )
        ->withDatabaseUri($this->FIREBASE_DB_URL)
        ->createDatabase();
        $data = $firebase->getReference('/')->getValue();

Upvotes: 0

pardeep
pardeep

Reputation: 359

Connect Firebase with Laravel using PHP SDK like this

public function index(){

$serviceAccount = ServiceAccount::fromJsonFile(__DIR__.'/Laraveltesting-6aeda3a963f2.json');

$firebase = (new Factory)

->withServiceAccount($serviceAccount)

->withDatabaseUri('https://laraveltesting-bd2b9.firebaseio.com/')

->create();

$database = $firebase->getDatabase();

$newPost = $database

->getReference('blog/posts')

->push([

'title' => 'Post title',

'body' => 'This should probably be longer.'

]);

//$newPost->getKey(); // => -KVr5eu8gcTv7_AHb-3-

//$newPost->getUri(); // => https://my-project.firebaseio.com/blog/posts/-KVr5eu8gcTv7_AHb-3-

//$newPost->getChild('title')->set('Changed post title');

//$newPost->getValue(); // Fetches the data from the realtime database

//$newPost->remove();

echo"<pre>";

print_r($newPost->getvalue());

}

Upvotes: 0

Nasser Ali Karimi
Nasser Ali Karimi

Reputation: 4663

OK! At the end I use this tutorial and fix my problem

My controller

    <?php

namespace App\Http\Controllers;

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

use Illuminate\Http\Request;

class FirebaseController extends Controller
{
    public function index(){
        $serviceAccount = ServiceAccount::fromJsonFile(__DIR__.'/bumpin-d8c5c-firebase-adminsdk-lerig-cb68aaed.json');
        $firebase = (new Factory)
            ->withServiceAccount($serviceAccount)
            ->create();
            $db = $firebase->getDatabase();
            $reference = $db->getReference('users');
            $snapshot = $reference->getSnapshot();
            $value = $snapshot->getValue();
            dd($value);
            return view('welcome' , compact('value'));
    }
}

From your Firebase console you can get your .json file Follow this path:

 Project Preview -> Project setting -> service accounts -> firebase admin sdk

download private key as json file and seve it

Then move .json file to controller and use that name in the controller like my example

$serviceAccount = ServiceAccount::fromJsonFile(__DIR__.'/bumpin-d8c5c-firebase-adminsdk-lerig-cb68aaed.json');

I hope this help some one!

Upvotes: 2

Related Questions