【问题标题】:Laravel 6 - Pass a parameter to $app->when()->needs()->give()Laravel 6 - 将参数传递给 $app->when()->needs()->give()
【发布时间】: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,或者有其他解决方案吗?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    https://stackoverflow.com/a/34224082/10371024

    我可以看到您需要什么,但是根据 Laravel 架构,将参数传递给引导方法并不是一个好主意。您可以尝试使用 Vladislav 建议的事件来获得所需的内容。

    【讨论】:

    • 感谢您的回答。感谢您的链接和解释,感谢this thread,我正在做类似的事情,如果可能的话,我会发布一个解释性答案
    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 2021-10-08
    • 2016-10-19
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多