hyperf 框架動態修改或追加配置

Nick發表於2022-03-01
需求背景

最近開發一個元件,有一個功能需要由元件提供配置,然後根據元件配置連線資料庫

解決思路

檢視文件發現框架的配置都是儲存在 Hyperf\Contract\ConfigInterface 物件中,只要能把配置寫入這個物件中,那麼在專案中就可以透過 config() 函式獲取到,實現動態連線資料庫。

熟悉 hyperf 框架的都知道,hyper 框架是基於 swoole 實現,常駐記憶體框架,框架一執行起來配置都在記憶體中無法修改和寫入,然後檢視框架生命週期,發現框架有提供不同事件,可以在框架啟動時動態寫入配置,基於這兩個特性,透過自定義監聽器實現追加配置到框架中。

文件:
hyperf.wiki/2.1/#/zh-cn/event
https://hyperf.wiki/2.2/#/zh-cn/config?id=configphp-%e4%b8%8e-autoload-%e6%96%87%e4%bb%b6%e5%a4%b9%e5%86%85%e7%9a%84%e9%85%8d%e7%bd%ae%e6%96%87%e4%bb%b6%e7%9a%84%e5%85%b3%e7%b3%bb

實現過程

自定義監聽器

<?php

declare(strict_types=1);

namespace App\Listener;

use Hyperf\Event\Contract\ListenerInterface;
use Hyperf\Event\Annotation\Listener;
use Hyperf\Framework\Event\AfterWorkerStart;
use Hyperf\Contract\ConfigInterface;
use Hyperf\Di\Annotation\Inject;

/**
 * @Listener
 */
class DataModelListener implements ListenerInterface
{
    /**
     * @Inject
     * @var \Hyperf\Contract\ConfigInterface
     */
    public $configInterface;

    public function listen(): array
    {
       // 事件
        return [
            AfterWorkerStart::class,
        ];
    }

    public function process(object $event)
    {
        // 讀取元件配置
        $config = config('xx.xx');
        // 寫入配置
        $this->configInterface::set('databases.test', $config);
    }
}

這樣透過監聽器在框架啟動時寫入配置,就可以專案中讀取。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
微信訂閱號:我愛Coding

相關文章