扩展Guzzle客户端并保持yaml配置

时间:2019-07-03 11:11:50

标签: php symfony guzzle symfony-3.4

我必须将所有潜在客户发送到相同的URL,但是我需要根据发送的潜在客户使用不同的ApiKey。

所以我想知道是否有一种方法可以创建具有公用BaseClient的父项base_url,并创建所需数量的客户端,并扩展BaseClient以仅定义ApiKey,而不必为每个客户端重新定义base_url

当前,我必须这样做:

yaml
    eight_points_guzzle:
    clients:
        client1:
            class: Client1
            base_url: '%common.apiurl%'
            options:
                headers:
                    apikey: '%client1.apikey%'
        client2:
            class: Client2
            base_url: '%common.apiurl%'
            options:
                headers:
                    apikey: '%client2.apikey%'
    ...

但是我希望能够做到这样:

yaml
    eight_points_guzzle:
    clients:
        base_client:
            class: BaseClient
            base_url: '%common.apiurl%'
            options:
                headers:
                    apikey: '%client1.apikey%'
        client1:
            class: Client1
            extends: base_client
            options:
                headers:
                    apikey: '%client1.apikey%'
        client2:
            class: Client2
            extends: base_client
            options:
                headers:
                    apikey: '%client2.apikey%'
        ...

或者对我来说更好:

yaml
    eight_points_guzzle:
    clients:
        base_client:
            class: BaseClient
            base_url: '%common.apiurl%'
            options:
                headers:
                    apikey: '%default.apikey%'
        client2:
            class: Client2
            extends: base_client
            options:
                headers:
                    apikey: '%client2.apikey%'
        ...

有人知道我该怎么做吗?

我知道我可以使用构造函数来做到这一点,但我想知道是否可以使用YAML配置来做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以这样做:

下面的BaseClientClass类(从GuzzleHttp \ Client扩展)应该具有setApiKey($key)setBaseUrl($url)函数。因此,无需为每条线索扩展或创建新的类。

your_specified_client1:
    class: BaseClientClass
    calls: 
      - [setBaseUrl, ['%your_base_url%']]
      - [setApiKey, ['%specified_api_key_1%']]

your_specified_client2:
    class: BaseClientClass
    calls: 
      - [setBaseUrl, ['%your_base_url%']]
      - [setApiKey, ['%specified_api_key_2%']]

您可以使用以下每种方法:$clientServiceFor2 = $this->get('your_specified_client2');