首页 > 解决方案 > 我应该在绑定 Laravel 服务提供程序时运行数据库查询吗?

问题描述

以下基本上是我现在拥有的,它似乎正在工作。但是我发现有人说你不应该在服务提供者中运行数据库查询,因为并不是所有的东西都可以注册。以这种方式进行配置是否存在潜在问题?如果是这样,是否有另一种方法来设置我从数据库中获取配置数据的类似情况?

我最初使用配置文件来绑定我想要的对象的实例

配置/payment.php

'test' => array(
    'terminalid' => env('TERMINAL'),
    'secret' => env('SECRET'),
),

注册方法中的PaymentServiceProvider

  public function register()
  {
      $this->app->bind(Gateway::class, function ($app) {
          $gateway = new Gateway();
          return $gateway->initialize([
              config('payment.test')
          ]);
      });
  }

但我想更改它以基于数据库查询的配置。

设置表

执照 终端 秘密
测试 ABC123 XXXX
演示 ZYX987 XXXY

所以像这样

  public function register()
  {
      $this->app->bind(Gateway::class, function ($app) {
          $setting = Setting::where("id",request()->id)->first();
          $gateway = new Gateway();
          return $gateway->initialize([
              'terminalid' => $setting->terminal,
              'secret' => $setting->secret,
          ]);
      });
  }

标签: laravelservice-provider

解决方案


我认为您可以将代码从注册方法移动到引导方法

public function boot() {
   $this->app->bind(Gateway::class, function ($app) {
      $setting = Setting::where("id",request()->id)->first();
      $gateway = new Gateway();
      return $gateway->initialize([
         'terminalid' => $setting->terminal,
         'secret' => $setting->secret,
      ]);
   });         
}

因此,您将确保所有需要的服务都已注册


推荐阅读