【问题标题】:Use Laravel to consume an external Laravel API使用 Laravel 使用外部 Laravel API
【发布时间】:2021-06-19 09:20:01
【问题描述】:

我有两个 Laravel 站点,一个客户端和一个服务器。客户端连接到服务器,服务器(除其他外)为数据库提供 RESTful api。虽然这个设置可能看起来有点复杂和多余,但它对于用例来说是必要的。

如何设置客户端以便它使用服务器的 API 与资源进行交互?

例如,服务器在/organisations/{id} 端点提供组织模型。如果我想将它们全部显示在客户端上,并提供一个更新每个组织的表格,是否有 Laravel 式的方式来做到这一点?或者它最终会被手工制作和破解?

【问题讨论】:

  • laravel.com/docs/8.x/passportlaravel.com/docs/8.x/sanctum 如果您的应用位于同一域中。
  • 我肯定会在授权方面使用 Sanctum,但看起来它们并没有提供将远程资源转换为模型的简洁方法
  • 等等,你想获取资源信息(假设是一个模型),然后在你的客户端设置(而不是服务器)中再次神奇地将它从 JSON 转换为模型?
  • 呵呵,就这样
  • 嗯,这真的很奇怪......你必须使用设计模式作为映射器,它更“高级/复杂”(容易做到,但应用时必须小心).. . 您不会将其“重新转换”为模型,但您可以拥有一个看起来像“临时对象”存储的实体,以便您可以使用数据并对其进行操作...

标签: php laravel rest architecture laravel-8


【解决方案1】:

您必须使用 http 客户端。 Laravel 已经提供了one,基于Guzzle

所以,为了更新一些东西,你必须在你的服务器上创建 PUT 路由,然后像这样从客户端调用它:

$response = Http::put("https://YOUR.SERVER/organisations/$id", [
    'name' => 'Steve',
    'role' => 'Network Administrator',
]);

更多信息,您可以在Laravel Documentation找到

【讨论】:

    【解决方案2】:

    如果您想使用 Laravel 作为前端客户端来轻松使用远程 API,部分原因是您可以考虑使用 vue.js 作为前端以使事情变得更简单。

    前端

    1. 像往常一样创建 Laravel 项目,唯一的区别是你不需要设置数据库和迁移

    2. 您将在这里使用普通的 MVC 模式,因此在您的 Frontend FlightController 类中,您将像这样获取数据。

    getFlights()
    {
        $response = Http::get(env('API_URL') . '/flights')->json();
    }
    

    我们可以选择安装包spatie/data-transfer-object 为了将您的 json 数据转换为 DTO 对象,如下所示:

    
    getFlights()
    {
        $flights_data = Http::get(env('API_URL') . '/flights')->json();
    
        $filghts = [];
    
        foreach($flight_data as data)
           $filghts->add(new \App\Models\Dto\FlightDto($data));
        
        return view('flights.search-result', compact('filghts'));
    }
    

    DTO 类如下所示:

    use Spatie\DataTransferObject\DataTransferObject;
    
    class FlightDto extends DataTransferObject
    {
        /** @var integer|null */
        public $id;
    
        /** @var string|null */
        public $flight_number;
    }
    

    身份验证有点棘手,请参阅this question 了解如何创建自定义用户提供程序。

    后台

    1. 创建一个 Laravel 项目,设置数据库和所有迁移

    2. 将所有路线放在默认位置api.php

    Route::get('/trips', 'ApiTripsController@getFlights');
    

    3- 在 FlightController 中执行以下操作

    public getFlights
    {
       return Flight::all() // where the Flight class is the Eloquent model
    }
    

    别忘了提供一个安全层来保护服务器端的资源

    【讨论】:

      猜你喜欢
      • 2021-03-04
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2022-11-07
      • 2020-03-10
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多