laravel - 我应该在绑定 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,
]);
});
}
解决方案
我认为您可以将代码从注册方法移动到引导方法
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,
]);
});
}
因此,您将确保所有需要的服务都已注册
推荐阅读
- mysql - 我想出了这个 SQL 结构来允许回滚和审计用户信息,这样就足够了吗?
- java - API数据以编码格式出现,如何在java中解码
- android - android.view.InflateException: Binary XML file line #54: Error inflating class EditText
- laravel - Laravel 将自定义中间件添加到路由组
- ios - 使用 Swagger API 的架构 x86_64 的未定义符号:
- ruby-on-rails - 在 Dokku 的移动设备上上传回形针照片 (S3) 时出错
- c# - 声明委托类型以匹配方法签名
- java - Eclipse Windowbuilder 不兼容的 Java
- generator - 使用生成器节省内存
- linux - bash 脚本和 zsh shell 中数组的行为(起始索引 0 还是 1?)