如何在PHP中使用Laravel和Google Firebase创建一个Restful CRUD API

696 阅读8分钟

在本教程中,你将学习如何用Laravel创建一个RESTful CRUD**(创建**、读取更新删除)API,将其数据存储在Firebase实时数据库中。

什么是Firebase?

谷歌Firebase是一个由谷歌支持的应用程序开发平台,使开发人员能够开发基于iOS,Android和Web的应用程序。Firebase提供了 ,用于跟踪分析、报告和修复应用崩溃、创建营销和产品实验等等。

所以,不要浪费时间,让我们深入了解一下。

安装和设置Laravel应用程序

要开始,你首先要安装一个Laravel应用程序,并在你的本地开发机器上运行它。

要做到这一点, 在你的终端, 运行下面的命令:

composer create-project laravel/laravel laravel_firebase
cd laravel_firebase

这些命令在一个名为laravel_firebase的目录中生成新的Laravel应用程序, 然后将它改到这个目录中, 这样以后所有的命令都从这里运行。

接下来, 通过在你的终端运行下面的命令来启动应用程序:

php artisan serve

默认情况下, Laravel项目会绑定到8000端口.所以要查看运行中的应用程序, 在你选择的浏览器中打开http://127.0.0.1:8000/.它应该看起来类似于下面的屏幕截图:

The default Laravel home page

一旦你看到应用程序正在运行, 按ctrl+c来停止应用程序.

设置一个Firebase数据库

要在Laravel中访问Firebase,你首先要配置Laravel来支持它。这是通过为Laravel安装一个Firebase包来完成的, 例如kreait/firebase-php, 它也支持Lumen项目。

要安装这个包, 运行下面的命令:

composer require kreait/laravel-firebase

接下来, 启用kreait/firebase-php的服务提供者,打开config/app.php,在 "包服务提供者 "部分的providers 元素中添加以下代码:

Kreait\Laravel\Firebase\ServiceProvider::class,

连接到Firebase

现在kreait/firebase-php's service provider已经设置好了,我们可以在Firebase中创建一个新的项目,并将其连接到我们的项目中,使我们能够向数据库中添加数据。

为了达到这个目的,我们将完成以下步骤:

  1. 创建一个新的Firebase项目。
  2. 创建一个服务账户。
  3. 获取我们的项目配置,并将其纳入我们的本地Laravel项目。
  4. 创建一个数据库。

创建项目

要做到这一点,去你的Google Firebase控制台,点击添加项目 按钮(你可以看到下面),这将带来一个包含在Firebase上创建一个新项目要求的对话框。

Firebase Console add project

在 "创建项目 "向导的第一步,输入一个项目名称,点击 "我接受Firebase条款 "旁边的复选框,然后点击继续。在第二步,取消勾选 "为这个项目启用Google Analytics",然后点击创建项目。过了一会儿,你的项目就会被创建。当它被创建时,点击继续

创建一个服务账户

要获得你的服务账户配置,请进入 "设置 "(在左侧导航栏的顶部) >"项目设置 ",然后在 "项目设置 "页面选择服务账户 标签 。

Firebase Console add service account

在那里,点击生成新的私钥 ,下载你的服务账户密钥的JSON格式。

拥有这个JSON文件的人就可以访问你的Firebase项目,数据可以被添加和获取,所以要非常小心你存储它的地方和谁可以使用它。理想情况下,将信息存储在一个密码管理器中,比如1PasswordBitwarden

添加配置

现在我们已经下载了我们的服务账户凭证,把它添加到项目的配置中。要做到这一点:

  • storage/app中创建一个名为firebase的新目录,将JSON文件移到那里。
  • 在.env中添加以下配置设置*。,用JSON文件的名称代替占位符。为了简单起见,我把我的JSON文件重命名为laravel-firebase-fec.json*。
// ...
FIREBASE_CREDENTIALS=/storage/app/firebase/<Your JSON filename.json>

创建一个数据库

我们已经得到并包含了我们的服务项目,现在到了另一个重要的方面,就是创建一个数据库,这样我们就可以添加、编辑和读取数据。

要开始,在窗口左侧的主导航中,在Build下点击Realtime Database。然后,点击创建数据库 ,你会看到一个有下拉选项的对话框,选择你的数据库应该位于哪个国家。

Set the Firebase realtime database location

选择任何一个选项并点击下一步。然后,在安全规则步骤中,点击下一步

当你的数据库完成后,点击规则 ,通过改变JSON与下面的JSON相匹配来更新读/写权限,使其一直保持开放,然后点击发布

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

接下来,将下面的配置复制到*.env*的底部:


// ...
FIREBASE_DATABASE_URL=<FIREBASE_URL>

Copy the Firebase database URL

然后,打开数据 标签,复制你的数据库URL(在上面的截图中突出显示),然后把它粘贴到你刚刚添加到*.env*底部的配置中的占位符位置。

然后你就可以通过在你的终端上运行下面的代码为你的Firebase服务提供者发布配置了:

php artisan vendor:publish --provider="Kreait\Laravel\Firebase\ServiceProvider" --tag=config

这就是在我们的应用程序中设置和使用Firebase的过程。

创建一个Firebase服务

我们将为Firebase创建一个服务类,用来存储你的证书,这样我们就不必在每次要进行请求时重复这个过程。要做到这一点,在app 目录下**,创建一个名为Services的新目录然后,在服务目录下,创建一个名为FirebaseService.php的PHP文件。

然后,将下面的代码粘贴到其中:

<?php

namespace App\Services;

use Illuminate\Http\Request;
use Kreait\Firebase;
use Kreait\Firebase\Factory;

class FirebaseService
{
    public static function connect()
    {
        $firebase = (new Factory)
            ->withServiceAccount(base_path(env('FIREBASE_CREDENTIALS')))
            ->withDatabaseUri(env("FIREBASE_DATABASE_URL"));

        return $firebase->createDatabase();
    }
}

上面的代码将使用先前存储在*.env*中的证书。

创建核心控制器

现在我们已经完成了Firebase的设置,我们可以创建一个控制器来连接到Firebase并对它进行CRUD请求。在你的终端,运行下面的命令来创建一个新的控制器,命名为App/Http/Controllers/TestController**.php

php artisan make:controller TestController

然后,在该类的顶部添加以下代码。它初始化了一个新的类成员变量,名为$database ,它提供了与Firebase数据库的连接:

private $database;

public function __construct()
{
    $this->database = \App\Services\FirebaseService::connect();
}

添加创建记录的功能

现在,将下面的create 函数添加到控制器中。这个函数在Firebase数据库中创建一个新的记录,记录数据从请求参数(title ,和content )中检索出来:

public function create(Request $request) 
{
    $this->database
        ->getReference('test/blogs/' . $request['title'])
        ->set([
            'title' => $request['title'] ,
            'content' => $request['content']
        ]);

    return response()->json('blog has been created');
}

添加列出所有记录的功能

接下来,在create 函数之后添加下面的代码:

public function index() 
{
    return response()->json($this->database->getReference('test/blogs')->getValue());
}

该函数检索Firebase数据库中blogs 表的所有记录,并在一个JSON响应中返回这些记录。

你可以对你想获取的数据进行更具体的说明,正如Kreait文档中所涉及的那样。

增加编辑记录的能力

像大多数数据库一样,Firebase给我们提供了在数据库中编辑现有数据集的能力,由Kreait创建的连接使其变得非常微不足道。要做到这一点,在TestController.php中现有的index 函数之后,粘贴下面这个edit 函数:

public function edit(Request $request) 
{
    $this->database->getReference('test/blogs/' . $request['title'])
        ->update([
            'content/' => $request['content']
        ]);

    return response()->json('blog has been edited');
}

该函数根据title 列从数据库中的blogs 表检索一条记录。然后,使用返回对象的update 函数,更新记录的内容,使用请求中提供的content 细节。

增加删除记录的能力

CRUD请求的另一个核心方面是删除记录的能力。TestController 要做到这一点,使用Firebase和Laravel,在edit 函数之后添加delete 函数,如下。这个函数会删除所有标题与title 查询参数中提供的值相符的记录:

public function delete(Request $request)
{
    $this->database
        ->getReference('test/blogs/' . $request['title'])
        ->remove();

    return response()->json('blog has been deleted');
}

添加所需的路由

接下来,我们将刚才在TestController.php中定义的读取、更新、创建和编辑数据功能的路由添加到应用程序的路由表中。要做到这一点,打开routes/api.php ,在文件末尾添加以下代码:

Route::post('/', [TestController::class, 'create']);
Route::get('/', [TestController::class, 'index']);
Route::put('/', [TestController::class, 'edit']);
Route::delete('/', [TestController::class, 'delete']);

最后,将下面的use 语句添加到文件的顶部:

use App\Http\Controllers\TestController;

测试应用程序

现在,是时候测试该应用程序是否工作了。为了做到这一点,我们将使用Curl来测试我们创建的各个端点,以查看响应并获得其返回的数据。在这样做之前,我们需要启动该应用程序。要做到这一点,请运行下面的命令:

php artisan serve

创建一个博客文章

为了测试你是否可以创建一个新的博客文章,在一个新的终端窗口中运行下面的curl命令:

curl -d 'title=hello from me&content=This is from curl' http://localhost:8000/api/

一旦成功,该命令应返回以下响应:

"blog has been created"% 

另外,如果你展开数据库中的记录,你应该看到新的博客文章的细节,类似于下面的截图:

New record in a Firebase database

更新一篇博客文章

现在,让我们测试一下更新一篇博文。要做到这一点,运行下面的命令。如果你愿意,可以把titlecontent 的值改成不同的值:

curl -X PUT -d 'title=hello from me&content=This is from curl 2' http://localhost:8000/api/

运行该命令后,如果你在Firebase控制台再次展开数据库记录,你应该看到它们已经被更新了,类似于下面的截图:

Updated record in a Firebase database

检索所有的博客文章

为了测试检索所有的文章,我们将再次使用curl调用API来检索所有可用的博客文章,将响应转为jq,这样就更容易阅读。

要做到这一点,运行下面的命令:

curl -s  http://localhost:8000/api/ | jq

这将得到所有添加的帖子,并以JSON格式返回到你的终端上:

{
     "hello from me": {
        "content": "This is from curl 2",
        "title": "hello from me"
    }
}

删除一篇博客文章

然后,我们将通过运行下面的命令来测试删除一个帖子的能力,作为结束:

curl -X DELETE -d 'title=hello from me' http://localhost:8000/api/

命令完成后,如果你在Firebase控制台再次查看数据库记录,你应该看到它们已经被删除了,类似于下面的截图。

Delete a record from a Firebase database

这就是如何在Laravel中建立一个由Google Firebase支持的RESTful CRUD API

在本教程中, 你学到了如何使用Kieait包创建一个由Firebase支持的新Laravel应用程序。该应用程序能够访问Firebase的一系列惊人的服务,特别是一个实时数据库。如果你想要一个完整的代码库,你可以分叉Github仓库并根据自己的需要进行定制。