将 Laravel 模型与外部 API 数据源同步的正确方法是啥?

Posted

技术标签:

【中文标题】将 Laravel 模型与外部 API 数据源同步的正确方法是啥?【英文标题】:What is the right way to synchronize Laravel model with an external API data sources?将 Laravel 模型与外部 API 数据源同步的正确方法是什么? 【发布时间】:2017-05-07 00:29:34 【问题描述】:

我想听听您对此问题的提示或解决方案。更有帮助的是一些工作的链接!实现其中一些机制的开源项目。

例如,我想将所有 github 的要点与 Laravel 模型同步。我考虑了两种形式。

选项 1

编写单独的类,例如 Importer,并从控制器和命令调用它的方法并与 Model 交互。

选项 2

将数据提取逻辑(api 调用)放入 Laravel 的模型层次结构(特征、接口等)和工匠的命令中,让我们说 synchronize:all 循环遍历所有模型并检查任何更改并更新每一行。

示例

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Sample\Http\Client;

class Gist extends Model

    /**
    * Example of fetching new gists
    */
    public static function getNew($gistId = '6cad326836d38bd3a7ae')
    
      $resposne = Client::request('GET', 'https://api.github.com/gists/'.$gistId)
        ->response()
        ->json();

      $Gist = new static($response);
      $Gist->save();

      return $Gist;
    

    /**
    * Get list of all gist from external source and ... who knows
    */
    public function listAllGistFromApi()
    
      $resposne = Client::request('GET', 'https://api.github.com/gists/')
        ->response()
        ->json();

        return $response;
    

    /**
    * Example of updating existing gist
    */
    public function updateFromApi()
    
      $gistId = $this->id; // primary key also api uid

      $resposne = Client::request('GET', 'https://api.github.com/gists/'.$gistId)
        ->response()
        ->json();

      return $this->setAttributes($response)->save(); // simplified logic
    

您的解决方案...

【问题讨论】:

我不需要***的代码。我想要的是你对这个问题的想法。 【参考方案1】:

你可以使用observers,它有什么作用?它会密切关注模型的变化,在那里你可以将你的 API 执行到 out 数据源,看看here 如何在Laravel 中应用observes

【讨论】:

可以,但是问题不大。我不知道如何强制 github 订阅我的观察者并在他们更改其要点时通知我。 (在此示例的上下文中)。唯一的方法是定期调用 api 端点与我的模型进行比较。怎么做?把这个逻辑放在哪里? 我认为你可以使用webhooks,github 有。当发生更改时,它会对您的后端进行 api 调用,因此您可以处理更改

以上是关于将 Laravel 模型与外部 API 数据源同步的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel - 通过外部 API 进行身份验证

如何使用外部 api 在 Laravel 应用程序中工作?

Laravel API resourceCollection 使用数组而不是模型

AFIncrementalStore 将核心数据与 REST API 同步

如何从外部 API 获取 $_POST 数据 - LARAVEL

Django:将来自外部 API 的数据映射到模型中?