【发布时间】:2020-10-10 23:13:00
【问题描述】:
我正在尝试使用this package 通过 OneSignal 向用户推送通知。但是我需要做一点改变。我的 API 服务于两个(相关)应用程序,并且我有两个 OneSignal 配置。我正在尝试覆盖它的 ServiceProvider(使用 this technique)。
ServiceProvider 如下所示
<?php
namespace NotificationChannels\OneSignal;
use Berkayk\OneSignal\OneSignalClient;
use Illuminate\Support\ServiceProvider;
use NotificationChannels\OneSignal\Exceptions\InvalidConfiguration;
class OneSignalServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*/
public function boot()
{
$this->app->when(OneSignalChannel::class)
->needs(OneSignalClient::class)
->give(function () {
$oneSignalConfig = config('services.onesignal');
if (is_null($oneSignalConfig)) {
throw InvalidConfiguration::configurationNotSet();
}
return new OneSignalClient(
$oneSignalConfig['app_id'],
$oneSignalConfig['rest_api_key'],
''
);
});
}
}
我要更改的行为位于该行
$oneSignalConfig = config('services.onesignal');
假设我的config/services.php 具有以下条目(在文档中说明):
// config/services.php
...
'onesignal' => [
'app_id' => env('ONESIGNAL_APP_ID'),
'rest_api_key' => env('ONESIGNAL_REST_API_KEY')
],
...
而我想如下设置我的config/services.php
// config/services.php
...
'onesignal' => [
'app1' => [
'app_id' => env('ONESIGNAL_1_APP_ID'),
'rest_api_key' => env('ONESIGNAL_1_REST_API_KEY')
],
'app2' => [
'app_id' => env('ONESIGNAL_2_APP_ID'),
'rest_api_key' => env('ONESIGNAL_2_REST_API_KEY')
],
],
...
我想以某种方式告诉我的 ServiceProvider(通过某种参数)要么这样做
$oneSignalConfig = config('services.onesignal.app1');
或
$oneSignalConfig = config('services.onesignal.app2');
但我没有找到任何方法将参数传递给类,boot 函数或 give 方法(如果我理解得很好,我什至不应该这样做)。
我能想到的唯一方法是创建两个扩展 OneSignalChannel::class 的类
并在boot 函数中复制代码,使其变为如下:
public function boot()
{
$this->app->when(FirstOneSignalChannel::class)
->needs(OneSignalClient::class)
->give(function () {
$oneSignalConfig = config('services.onesignal.app1');
if (is_null($oneSignalConfig)) {
throw InvalidConfiguration::configurationNotSet();
}
return new OneSignalClient(
$oneSignalConfig['app_id'],
$oneSignalConfig['rest_api_key'],
''
);
});
$this->app->when(SecondOneSignalChannel::class)
->needs(OneSignalClient::class)
->give(function () {
$oneSignalConfig = config('services.onesignal.app2');
if (is_null($oneSignalConfig)) {
throw InvalidConfiguration::configurationNotSet();
}
return new OneSignalClient(
$oneSignalConfig['app_id'],
$oneSignalConfig['rest_api_key'],
''
);
});
}
when 的差异引发了config 的差异,但它似乎有很多重复且不可扩展(如果我有三个应用程序会怎样)。
我应该使用这种方法,或者有没有办法将参数传递给这个ServiceProvider,或者有其他解决方案吗?
【问题讨论】: