Использование Laravel с микросервисами: возможно ли использовать eloquent без базы данных? - PullRequest
1 голос
/ 06 апреля 2020

Мы используем микросервисную архитектуру. Для службы laravel существует 2 набора данных:

  • База данных, в которой находятся администраторы.
  • И все остальные данные, к которым могут обращаться администраторы, которые поступают через вызовы GRPC для других служб.

Я хочу что-то вроде eloquent (может быть, Ресурс API ? ) для структурирования данных / отношений, но вместо того, чтобы выполнять запросы к базе данных для загрузки данных, необходимо выполнить вызовы GRP C для других служб. Я думал о создании собственного класса, который бы расширял возможности красноречивых и перегруженных защищенных функций, которые делают вызовы в базу данных, но это звучит как рецепт плохого времени. Если у кого-то есть опыт в выполнении того, что я описываю, в каком направлении вы go? Что сработало? что не сделал?

1 Ответ

0 голосов
/ 09 апреля 2020

Итак, я вообще не использовал eloquent. Я продолжил использовать протокол c, настроенный как , документация объясняет . Но я использовал привязку маршрутов для включения подсказок типов в контроллерах:

<?php

namespace App\Providers;

use OurNamespace\GrpcClient;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use OurNamespace\Customer;
use OurNamespace\CustomerIdInput;

class RouteServiceProvider extends ServiceProvider
{
    /**
     * This namespace is applied to your controller routes.
     *
     * In addition, it is set as the URL generator's root namespace.
     *
     * @var string
     */
    protected $namespace = 'App\Http\Controllers';

    /**
     * Define your route model bindings, pattern filters, etc.
     *
     * @return void
     */
    public function boot()
    {
        //

        parent::boot();
        Route::bind('customer', function ($customerId) {
            $grpcClient = app(GrpcClient::class);
            $customerIdInput = new CustomerIdInput();
            $customerIdInput->setCustomerId($customerId);
            list($customer, $status) = $grpcClient->GetCustomerDetails($customerIdInput)->wait();
            if ($status->code != 0) {
                error_log('ERROR - ' . print_r($status, 1));
                return redirect()->back()->withErrors(['There was an error retrieving that customer', $status->details]);
            }
            return $customer;
        });

GrpcClient исходит от AppServiceProvider. Таким образом, если мы хотим сделать запрос, нам не нужно создавать его вручную.

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use OurNamespace\GrpcClient;
use Grpc\ChannelCredentials;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton('OurNamespace\GrpcClient', function ($app) {
            return new GrpcClient(env('GRPC_HOST'), [
                'credentials' => ChannelCredentials::createInsecure(),
            ]);
        });

...