# Introduction

> Learn how to integrate Dub with PHP.

import Prerequisites from "/snippets/sdk-prerequisites.mdx";
import LinkArguments from "/snippets/link-arguments.mdx";

<Prerequisites />

## 2. Install and initialize the Dub PHP SDK

<Steps titleSize="h3">

<Step title="Install">

To install the [Dub PHP SDK](https://dub.co/sdks/php), run the following command:

```bash
composer require dub/dub-php
```

</Step>

<Step title="Initialize">

Initialize the Dub PHP SDK by creating a new instance of the `Dub` class.

```php index.php
declare(strict_types=1);

require 'vendor/autoload.php';

use Dub\Dub;
use Dub\Models\Components;

$dub = Dub::builder()->setSecurity("DUB_API_KEY")->build();
```

</Step>

</Steps>

## 3. Create link

Let's create a short link using the Dub PHP SDK.

```php index.php
use Dub\Models\Operations;

try {
  $request = new Operations\CreateLinkRequestBody(
    url: 'https://google.com',
  );

  $response = $dub->links->create($request);

  if ($response->linkSchema !== null) {
    // handle response
  }
} catch (Throwable $e) {
  // handle exception
}
```

<Accordion title="Full list of available attributes for the Link model">
  <LinkArguments />
</Accordion>

Optionally, you can also pass an `externalId` field which is a unique identifier for the link in your own database to associate it with the link in Dub's system.

```php index.php
use Dub\Models\Operations;

try {
  $request = new Operations\CreateLinkRequestBody(
    url: 'https://google.com',
    externalId: '12345',
  );

  $response = $dub->links->create($request);

  if ($response->linkSchema !== null) {
    // handle response
  }
} catch (Throwable $e) {
  // handle exception
}
```

This will let you easily [update the link](#5-update-link) or [retrieve analytics](#6-retrieve-analytics-for-link) for it later on using the `externalId` instead of the Dub `linkId`.

## 4. Upsert link

Dub PHP SDK provides a method to upsert a link – where an existing link is updated if it exists, or a new link is created if it doesn't. so you don't have to worry about checking if the link already exists.

```php index.php
use Dub\Models\Operations;

try {
  $request = new Operations\UpsertLinkRequestBody(
    url: 'https://google.com',
  );

  $response = $dub->links->upsert($request);

  if ($response->linkSchema !== null) {
    // handle response
  }
} catch (Throwable $e) {
  // handle exception
}
```

This way, you won't have to worry about checking if the link already exists when you're creating it.

## 5. Update link

Let's update an existing link using the Dub PHP SDK.

You can do that in two ways:

- Using the link's `linkId` in Dub's system.
- Using the link's `externalId` in your own database (prefixed with ext\_).

```php index.php
use Dub\Models\Operations;

try {
    $request = new Operations\UpdateLinkRequest();
    $request->linkId = 'cly2p8onm000cym8200nfay7l';
    $request->requestBody = new Operations\UpdateLinkRequestBody();
    $request->requestBody->url = 'https://google.us';

    $response = $dub->links->update($request);

    if ($response->linkSchema !== null) {
        echo $response->linkSchema->shortLink;
    }
} catch (Throwable $e) {
    // handle exception
}
```

## 6. Retrieve analytics for link

Let's retrieve analytics for a link using the Dub PHP SDK.

```php index.php
use Dub\Models\Operations;

try {
    $request = new Operations\RetrieveAnalyticsRequest();
    $request->linkId = 'clmnr6jcc0005l308q9v56uz1';
    $request->interval = Operations\Interval::SevenD;
    $request->groupBy = Operations\GroupBy::Timeseries;

    $response = $dub->analytics->retrieve($request);

    if ($response->oneOf !== null) {
        // Handle the response
        print_r($response->oneOf);
    }
} catch (Throwable $e) {
    // handle exception
}
```

## 7. Examples

<CardGroup cols={2}>
  <Card
    title="PHP Example"
    icon="github"
    href="https://github.com/dubinc/examples/tree/main/php"
    color="#333333"
  >
    See the full example on GitHub.
  </Card>
</CardGroup>
