---
title: Modify User-Agent In Request Headers
slug: php-sdk/modify-headers
docTags: 
createdAt: 2024-05-13T16:11:24.384Z
---

## Introduction

The `UserAgentProvider` is responsible for collating and returning all configured components separated by a space character. This class is a composite provider, that can be configured via DI to inject additional providers into the constructor which are included in the `User-Agent` header value used in API calls.

There should be no need to replace this class with your own implementation, and doing so may break other packages which inject their own providers. Instead, create additional class(es) implementing the `UserAgentProviderInterface` which return the user agent information (either new components or additional information for an existing component, where supported).

## Inject Additional Components

First, create a new class which implements `Provider\UserAgentProviderInterface` and add the `execute` method, returning the desired string.

:::hint{type="info"}
If you wish to allow other modules to inject their own system information into your component, you can should implement the `Provider\ComposableUserAgentProviderInterface` interface, which extends the base interface.
You can also use the`Provider\ComposableUserAgentProviderTrait` to include implementation of child providers.
:::



:::CodeblockTabs
Basic

```php
<?php

declare(strict_types=1);

namespace Acme\MyModule\Provider\UserAgent;

use Klevu\PhpSDK\Provider\UserAgentProviderInterface;

class PhpSDKUserAgentProvider implements UserAgentProviderInterface
{
    /**
     * @return string
     */
    public function execute(): string
    {
        return 'MyModule/1.0.0';
    }
}

```

Composable

```php
<?php

declare(strict_types=1);

namespace Acme\MyModule\Provider\UserAgent;

use Klevu\PhpSDK\Provider\ComposableUserAgentProviderInterface;
use Klevu\PhpSDK\Provider\ComposableUserAgentProviderTrait;
use Klevu\PhpSDK\Provider\UserAgentProviderInterface;

class MyUserAgentProvider implements ComposableUserAgentProviderInterface
{
    use ComposableUserAgentProviderTrait;

    /**
     * @param array<string, UserAgentProviderInterface> $systemInformationProviders
     */
    public function __construct(
        array $systemInformationProviders,
    ) {
        array_walk(
            array: $systemInformationProviders,
            callback: function (mixed $systemInformationProvider, int|string $identifier): void {
                $this->addUserAgentProvider(
                    userAgentProvider: $systemInformationProvider,
                    identifier: $identifier,
                );
            },
        );
    }
    
    /**
     * @return string
     */
    public function execute(): string
    {
        return sprintf(
            'MyModule/1.0.0 (%s)',
            implode(
                separator: ' ',
                array: array_map(
                    callback: static fn (UserAgentProviderInterface $systemInformationProvider): string => (
                        $systemInformationProvider->execute()
                    ),
                    array: $this->userAgentProviders, 
                ),
            ),
        );
    }
}

```
:::

Once you have your user agent provider, create a new instance of `UserAgentProvider` and inject it into the constructor.&#x20;
Note: *If you are integrating into a modern framework, you should implement this via your dependency injection system*

This User Agent Provider instance can then be passed into any service which interacts with Klevu's APIs

```php
<?php

declare(strict_types=1);

use Acme\MyModule\Provider\UserAgent\MyUserAgentProvider;
use Klevu\PhpSDK\Provider\UserAgentProvider;
use Klevu\PhpSDK\Service\Account\AccountFeaturesService;
use Klevu\PhpSDK\Service\Account\AccountLookupService;
use Klevu\PhpSDK\Service\Account\UpdateStoreFeedUrlService;
use Klevu\PhpSDK\Service\Analytics\CollectService as AnalyticsCollectService;
use Klevu\PhpSDK\Service\Indexing\AttributesService;
use Klevu\PhpSDK\Service\Indexing\Batch\DeleteService as BatchDeleteService;
use Klevu\PhpSDK\Service\Indexing\BatchService;

$userAgentProvider = new UserAgentProvider(
    userAgentProviders: [
        new MyUserAgentProvider(),
    ],
);

// Or, if using the composable templates

$userAgentProvider = new UserAgentProvider(
    userAgentProviders: [
        new MyUserAgentProvider(
            systemInformationProviders: [
                new MySystemInformationProvider(),
            ],
        ),
    ],
);

// Account
$accountFeatureService = new AccountFeaturesService(
    userAgentProvider: $userAgentProvider,
);
$accountLookupService = new AccountLookupService(
    userAgentProvider: $userAgentProvider,
);
$updateStoreFeedUrlService = new UpdateStoreFeedUrlService(
    userAgentProvider: $userAgentProvider,
);

// Analytics
$collectService = new AnalyticsCollectService(
    userAgentProvider: $userAgentProvider,
);

// Indexing
$attributesService = new AttributesService(
    userAgentProvider: $userAgentProvider,
);
$batchService = new BatchService(
    userAgentProvider: $userAgentProvider,
);
$batchDeleteService = new BatchDeleteService(
    userAgentProvider: $userAgentProvider,
);
```

In the above scenario, the expected user agent string result would look like
`klevu-php-sdk/0.0.0.1 (PHP 8.1.999) MyModule/1.0.0`
or, if composble
`klevu-php-sdk/0.0.0.1 (PHP 8.1.999) MyModule/1.0.0 (MySystem)`

***

## Source Code Reference

- Provider\\[ComposableUserAgentProviderInterface](https://github.com/klevu/php-sdk/blob/master/src/Provider/ComposableUserAgentProviderInterface.php)
- Provider\\[ComposableUserAgentProviderTrait](https://github.com/klevu/php-sdk/blob/master/src/Provider/ComposableUserAgentProviderTrait.php)
- Provider\\[UserAgentProvider](https://github.com/klevu/php-sdk/blob/master/src/Provider/UserAgentProvider.php)
- Provider\\[UserAgentProviderInterface](https://github.com/klevu/php-sdk/blob/master/src/Provider/UserAgentProviderInterface.php)

