PHPackages                             gando/partner-symfony - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Framework](/categories/framework)
4. /
5. gando/partner-symfony

ActiveSymfony-bundle[Framework](/categories/framework)

gando/partner-symfony
=====================

Symfony bundle for the Gando Partner PHP SDK

v0.1.5(3w ago)012↓88.9%MITPHPPHP &gt;=8.2CI passing

Since Jun 2Pushed 3w agoCompare

[ Source](https://github.com/Gando-Solutions/gando-partner-php-symfony)[ Packagist](https://packagist.org/packages/gando/partner-symfony)[ RSS](/packages/gando-partner-symfony/feed)WikiDiscussions main Synced 1w ago

READMEChangelogDependencies (15)Versions (7)Used By (0)

gando/partner-symfony
=====================

[](#gandopartner-symfony)

Symfony bundle for the [Gando Partner PHP SDK](https://github.com/gando-app/gando-partner-php) (`gando/partner`). It registers the API client, optional Connect URL builder, a **ready-to-wire webhook controller**, and optional `#[GandoWebhook]` attribute verification.

Requirements
------------

[](#requirements)

- PHP 8.2+
- Symfony 6.4 LTS or 7.x
- `gando/partner` ^0.1.7

Recommended: `symfony/http-client`, `symfony/framework-bundle`, `symfony/cache` (webhook dedup).

Installation
------------

[](#installation)

```
composer require gando/partner-symfony
```

Register the bundle (Symfony Flex does this automatically):

```
// config/bundles.php
return [
    // ...
    Gando\Partner\Symfony\GandoPartnerBundle::class => ['all' => true],
];
```

Configuration
-------------

[](#configuration)

```
# config/packages/gando_partner.yaml
gando_partner:
    api_key: '%env(GANDO_API_KEY)%'
    base_url: 'https://gando.app'
    connect:
        secret: '%env(GANDO_CONNECT_SECRET)%'
        partner_slug: 'fleetee'
        base_url: 'https://dashboard.gando.app'
    webhooks:
        secret: '%env(GANDO_WEBHOOK_SECRET)%'
        tolerance_seconds: 300
        path: /webhooks/gando
        dedup_ttl_seconds: 86400
```

OptionDescription`api_key`Partner API key (`gando_pk_…`), required`base_url`API base URL (default `https://gando.app`)`connect.secret`Connect signing secret (`gando_cs_…`)`connect.partner_slug`Slug in connect URLs`connect.base_url`Dashboard base URL (default `https://dashboard.gando.app`)`webhooks.secret`Webhook signing secret (`whsec_…` or `gando_whsec_…`)`webhooks.tolerance_seconds`Max webhook age in seconds (default `300`)`webhooks.path`Route path for bundled webhook controller (default `/webhooks/gando`)`webhooks.dedup_ttl_seconds`Dedup window when `cache.app` is present (default `86400`)`connect` and `webhooks` sections are optional. Configure `webhooks.secret` to enable the bundled webhook controller.

Usage
-----

[](#usage)

### Inject the API client

[](#inject-the-api-client)

```
use Gando\Partner\Api\Client;

final class DepositService
{
    public function __construct(
        private readonly Client $gando,
    ) {
    }

    public function listDeposits(): void
    {
        $response = $this->gando->deposits->list(page: 1, limit: 20);
        // ...
    }
}
```

### Partner connect URLs

[](#partner-connect-urls)

When `connect` is configured, inject `Gando\Partner\Connect\UrlBuilder`:

```
$url = $this->urlBuilder->signupUrl(externalId: 'fleet_acct_42');
```

### Webhook endpoint (recommended — 2 lines)

[](#webhook-endpoint-recommended--2-lines)

**Route** (`config/routes/gando_partner.yaml`):

```
gando_partner_webhook:
    path: /webhooks/gando
    controller: gando.partner.webhook_controller
    methods: [POST]
```

The bundle also auto-imports `config/routes/webhook.php` with path `%gando_partner.webhooks.path%`.

**Handler** — subscribe to typed events:

```
use Gando\Partner\Symfony\Event\DepositActivated;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

#[AsEventListener]
final class SyncDepositOnActivation
{
    public function __invoke(DepositActivated $event): void
    {
        // Dispatch to Messenger / queue — keep this fast.
    }
}
```

ClassGando event (`partner-webhook.service`)`Gando\Partner\Symfony\Controller\GandoWebhookController`HTTP ingress — verify, dedup, dispatch, 200`Gando\Partner\Symfony\Event\WebhookReceived`All verified webhooks (always first)`Gando\Partner\Symfony\Event\RentalOperatorLinked``rental_operator.linked``Gando\Partner\Symfony\Event\DepositStatusChanged``deposit.status_changed``Gando\Partner\Symfony\Event\DepositActivated``deposit.activated``Gando\Partner\Symfony\Event\DepositCaptured``deposit.captured``Gando\Partner\Symfony\Event\DepositExpired``deposit.expired``Gando\Partner\Symfony\Event\DepositCancelled``deposit.cancelled`Full walkthrough: [docs/recipes/webhook.md](docs/recipes/webhook.md) (async processing with Messenger, dedup, endpoint creation).

### Webhook attribute (custom controllers)

[](#webhook-attribute-custom-controllers)

Mark your own action with `#[GandoWebhook]` if you do not use the bundled controller. Verification runs on `kernel.controller` before your code.

```
use Gando\Partner\Symfony\Attribute\GandoWebhook;

#[Route('/custom/webhook', methods: ['POST'])]
#[GandoWebhook]
public function __invoke(Request $request): Response
{
    // ...
}
```

Invalid signatures return **400** with an empty body.

HTTP client integration
-----------------------

[](#http-client-integration)

When Symfony's `http_client` service exists and `symfony/http-client` is installed, the bundle wraps it with `Symfony\Component\HttpClient\Psr18Client` and passes it to `Gando\Partner\Api\Client`. Optional PSR services (`logger`, `cache.app`, `event_dispatcher`) are wired when present.

Further reading
---------------

[](#further-reading)

- [Gando Partner PHP SDK](https://github.com/gando-app/gando-partner-php) — API reference, error handling
- [Partner API docs](https://gando.app/docs) — OpenAPI / Scalar
- [Webhook recipe](docs/recipes/webhook.md) — end-to-end Symfony setup

License
-------

[](#license)

MIT

###  Health Score

38

—

LowBetter than 83% of packages

Maintenance95

Actively maintained with recent releases

Popularity6

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity40

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~6 days

Total

6

Last Release

21d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/ceeaafe1b59c078ad43309962b69b48336d8bcd891dcad0bb67f8cd9281640ce?d=identicon)[OlivierDevMaster](/maintainers/OlivierDevMaster)

---

Top Contributors

[![OlivierDevMaster](https://avatars.githubusercontent.com/u/98014033?v=4)](https://github.com/OlivierDevMaster "OlivierDevMaster (9 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Type Coverage Yes

### Embed Badge

![Health badge](/badges/gando-partner-symfony/health.svg)

```
[![Health](https://phpackages.com/badges/gando-partner-symfony/health.svg)](https://phpackages.com/packages/gando-partner-symfony)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
