You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Laravel API中切换OneSignal密钥实现多应用推送通知

嘿,这个需求我之前做项目时刚好碰到过,给你几个实用的方案,按需选就行~

方法1:直接动态创建OneSignal客户端实例

这是最灵活直接的方式,完全不用改动原有配置,每次发送时根据业务场景传入对应密钥就行:

假设你用的是OneSignal官方PHP SDK,在需要发送通知的代码里直接初始化不同的客户端:

use OneSignal\OneSignal;

// 给应用1发推送
$oneSignalApp1 = new OneSignal();
$oneSignalApp1->setAppId(env('ONESIGNAL_APP_ID_1'));
$oneSignalApp1->setRestApiKey(env('ONESIGNAL_REST_API_KEY_1'));
// 调用发送接口,填入你的推送参数
$oneSignalApp1->notifications()->create([
    'headings' => ['en' => '应用1推送标题'],
    'contents' => ['en' => '应用1推送内容'],
    // 其他参数...
]);

// 给应用2发推送
$oneSignalApp2 = new OneSignal();
$oneSignalApp2->setAppId(env('ONESIGNAL_APP_ID_2'));
$oneSignalApp2->setRestApiKey(env('ONESIGNAL_REST_API_KEY_2'));
$oneSignalApp2->notifications()->create([
    'headings' => ['en' => '应用2推送标题'],
    'contents' => ['en' => '应用2推送内容'],
    // 其他参数...
]);

这种方式的好处是简单粗暴,完全按需切换,不会影响全局配置,适合场景不多的情况。

方法2:用自定义管理器类解耦配置

如果你的项目需要频繁切换两个应用的推送,推荐用这种方式,把配置和发送逻辑解耦,更符合Laravel的优雅风格:

首先先更新config/services.php,把两组配置都存进去:

'onesignal' => [
    'app1' => [
        'app_id' => env('ONESIGNAL_APP_ID_1'),
        'rest_api_key' => env('ONESIGNAL_REST_API_KEY_1'),
    ],
    'app2' => [
        'app_id' => env('ONESIGNAL_APP_ID_2'),
        'rest_api_key' => env('ONESIGNAL_REST_API_KEY_2'),
    ],
],

然后创建一个OneSignalManager服务类,用来统一获取不同应用的客户端:

namespace App\Services;

use OneSignal\OneSignal;

class OneSignalManager
{
    public function getClient(string $appKey): OneSignal
    {
        // 根据传入的key获取对应配置
        $config = config("services.onesignal.{$appKey}");
        
        $client = new OneSignal();
        $client->setAppId($config['app_id']);
        $client->setRestApiKey($config['rest_api_key']);
        
        return $client;
    }
}

之后在控制器或者业务逻辑里,直接注入这个管理器就能切换了:

use App\Services\OneSignalManager;

class PushController extends Controller
{
    public function sendToApp1(OneSignalManager $manager)
    {
        $client = $manager->getClient('app1');
        $client->notifications()->create([/* 推送参数 */]);
    }
    
    public function sendToApp2(OneSignalManager $manager)
    {
        $client = $manager->getClient('app2');
        $client->notifications()->create([/* 推送参数 */]);
    }
}
方法3:适配Laravel自带通知系统(如果用的话)

如果你项目里用的是Laravel原生的通知系统来发OneSignal推送,可以改造通知类来动态切换配置:

先创建一个自定义通知类,接收一个标识应用的参数:

namespace App\Notifications;

use Illuminate\Notifications\Notification;
use Illuminate\Notifications\Messages\OneSignalMessage;

class AppPushNotification extends Notification
{
    protected $appKey;

    public function __construct(string $appKey)
    {
        $this->appKey = $appKey;
    }

    public function via($notifiable)
    {
        return ['onesignal'];
    }

    public function toOneSignal($notifiable)
    {
        // 动态覆盖全局配置
        $config = config("services.onesignal.{$this->appKey}");
        config(['services.onesignal.app_id' => $config['app_id']]);
        config(['services.onesignal.rest_api_key' => $config['rest_api_key']]);

        return OneSignalMessage::create()
            ->subject('你的推送标题')
            ->body('你的推送内容');
    }
}

发送的时候指定应用key就行:

// 给应用1发
$user->notify(new AppPushNotification('app1'));
// 给应用2发
$user->notify(new AppPushNotification('app2'));

⚠️ 注意:这种方式是修改全局配置,如果你的项目用了队列发送通知,并发场景下可能会出现配置污染的问题,所以队列环境下更推荐用前两种方法。

内容的提问来源于stack exchange,提问作者user8022208

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:21:55