为了账号安全,请及时绑定邮箱和手机立即绑定

将 Laravel 与微服务一起使用:是否可以在没有数据库的情况下使用 Eloquent?

将 Laravel 与微服务一起使用:是否可以在没有数据库的情况下使用 Eloquent?

PHP
holdtom 2022-12-11 08:58:52
我们正在使用微服务架构。laravel服务有两组数据:容纳管理员的数据库。以及管理员可以访问的所有其他数据,这些数据来自对其他服务的 GRPC 调用。我想要像 eloquent(也许是API 资源?)这样的东西来构建数据/关系,但不是进行数据库查询来加载数据,而是需要对其他服务进行 GRPC 调用。我正在考虑制作一个自定义类,该类扩展了 Eloquent 并重载了调用数据库的受保护函数,但这听起来像是一个糟糕时期的秘诀。如果有人有做我所描述的事情的经验,你去了哪个方向?什么起作用了?什么没有?
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

所以,我最终根本没有使用 eloquent。我继续使用文档中解释的协议设置。但是我使用路由绑定在控制器中启用类型提示:

<?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;

        });

来自GrpcClientAppServiceProvider。这样,如果我们想进行查询,就不必手动实例化它。


<?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(),

            ]);

        });


查看完整回答
反对 回复 2022-12-11
  • 1 回答
  • 0 关注
  • 127 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号