【问题标题】:Laravel eloquent table-less data from external source来自外部源的 Laravel 雄辩的无表数据
【发布时间】:2017-12-12 11:59:05
【问题描述】:

我正在开发一个应用程序,其中我的数据来自 JSON 格式的外部服务器。

我想设置每个模型之间的关系,但不使用数据库表。

有可能吗?

类似的东西:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = 'https://.../server/flights.json';
}

【问题讨论】:

  • 为什么不创建一个“服务”类,从 api 获取数据并使用“工厂”实例化模型?
  • 使用此代码示例,我认为您走错路了!服务设置
  • 您能否提供任何指向一个好的来源的链接,我可以在其中获得更多信息?你说的是服务容器吗? laravel.com/docs/5.4/container

标签: php laravel web-services eloquent relationship


【解决方案1】:

您可以创建一个服务类来处理请求并返回类实例:

namespace App\Services;

class FlightService
{
    /**
    * @var FlightFactory
    */
    private $flightFactory;

    public function __construct(FlightFactory $flightFactory)
    {
        $this->flightFactory = $flightFactory;
    }

    public function getAllFlights()
    {
        $flightsJson = $this->getFromExternalCurl();
        return $this->flightFactory->buildFlightList($flightsJson);
    }

    private function getFromExternalCurl()
    {
        return Curl::to('http://www.foo.com/flights.json')
        ->withData( array( 'foz' => 'baz' ) )
        ->asJson()
        ->get();
    }

}

基本上,服务会进行外部 API 调用,并将响应传递给创建实例的工厂。

请注意,您只需在构造中添加工厂并绑定它,因为 laravel 使用 https://laravel.com/docs/5.4/container

namespace App\Factories;

class FlightFactory
{
    public function buildFlightList($flightJsonList)
    {
        $flightCollection = collect();
        foreach($flightJsonList as $flightJson) {
            $flightCollection->push($this->buildFlight($flightJson));
        }
        return $flightCollection;
    }

    public function buildFlight($flightJson)
    {
        $flight = new Flight();
        // add properties
        return $flight;
    }

}

工厂将返回一个非常有用的Collection,因为它包含有用的方法,或者您可以返回一个数组。

在这个例子中,我使用了一个 curl 库 https://github.com/ixudra/curl,但它可以替换为原生 php 或其他库。

然后你可以通过在你的控制器中注入FlightService来使用。

P.S:代码未经测试,但代表一种可能的方法

【讨论】:

  • 谢谢卡林!我正在尝试实施您的建议。之后我会给出我的反馈。
  • 可能我遗漏了一些东西,但是我应该如何连接它,所以 Model 的方法,如 belongsTo,hasMany 会被接受?
  • 那些是 ORM 特定的,你确实说过你不想使用 DB,你想从 API 中获取数据存储它,处理它并显示它还是只是获取并显示?跨度>
  • 这些数据通过 API 实时来自外部服务器,无需将它们存储在内部应用程序数据库中。你觉得有可能吗?
猜你喜欢
  • 2020-11-03
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 2015-08-09
  • 2021-10-02
  • 2016-06-05
相关资源
最近更新 更多