【问题标题】:Laravel and Firebase real time database connectionLaravel 和 Firebase 实时数据库连接
【发布时间】:2018-08-21 10:53:17
【问题描述】:

我想将 laravel 项目与 firebase 连接起来。 我这样做:

  1. 从githubhttps://github.com/mpociot/laravel-firebase-sync安装这个包
  2. 配置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
    ],
    

我想从 firebase DB 获取数据,但是当我在 thinker 上运行此命令时

App\Users::first();

我收到了这个错误

Illuminate\Database\QueryException 与消息 'SQLSTATE[HY000] [2002] 无法建立连接,因为目标机器 e主动拒绝了。 (SQL: select * from users limit 1)'

这也是我的用户模型

<?php

namespace App;

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

class Users extends Model
{

    use SyncsWithFirebase;

    protected $table = 'users';
}

你会指导我吗?

【问题讨论】:

  • 仔细检查database_url、secret 和所有详细信息!
  • 对于我使用垃圾数据获取机密信息的问题
  • 试试:$user = $auth-&gt;getUser('some-uid');

标签: javascript php laravel firebase


【解决方案1】:

这是我用来通过实时 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;
    }
}

【讨论】:

  • 虽然这段代码 sn-p 可以解决问题,但它没有解释为什么或如何回答这个问题。请include an explanation for your code,因为这确实有助于提高您的帖子质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
【解决方案2】:

如果您想从数据库中获取所有数据,则可以使用此代码。

这里$this-&gt;FIREBASE_JSON 是唯一的私钥,$this-&gt;FIRE_DB_URL 是您的数据库的 URL,它们在构造函数中被初始化。

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

【讨论】:

    【解决方案3】:

    像这样使用 PHP SDK 连接Firebase with Laravel

    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());
    
    }
    

    【讨论】:

      【解决方案4】:

      好的! 最后,我使用本教程解决了我的问题

      我的控制器

          <?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'));
          }
      }
      

      您可以从 Firebase 控制台获取 .json 文件 走这条路:

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

      将私钥下载为json文件并保存

      然后将 .json 文件移动到控制器并像我的示例一样在控制器中使用该名称

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

      希望对大家有所帮助!

      【讨论】:

      • 使用“fromJsonFile()”会出错 -> 调用私有方法 Kreait\Firebase\ServiceAccount::fromJsonFile()
      猜你喜欢
      • 2021-07-28
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 2021-08-24
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多