---
title: "Webhooky — Git for Laravel | Roundly"
description: "Prijímajte webhooky s overeným podpisom ako typované Laravel eventy a zaregistrujte svoj endpoint na repozitári idempotentne jedným volaním."
url: https://roundly-consulting.com/sk/open-source/navody/git-for-laravel/webhooky
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Git for Laravel](https://roundly-consulting.com/sk/open-source/navody/git-for-laravel.md)

# Webhooky

Zapnite prijímanie a nastavte tajomstvo pre každého providera:

```bash
GIT_WEBHOOKS_ENABLED=true
GITHUB_WEBHOOK_SECRET=your-github-secret
GITLAB_WEBHOOK_SECRET=your-gitlab-secret
BITBUCKET_WEBHOOK_SECRET=your-bitbucket-secret
```

Prichádzajúce požiadavky na POST {webhooks.path}/{provider} — predvolene /git/webhooks/github, názov routy git.webhooks — prejdú overením podpisu a doručia sa ako eventy. Payloady prechádzajú rovnakými mappermi ako čítania, takže listenery dostanú typované metódy nezávislé od platformy namiesto ručného parsovania troch rôznych formátov:

```php
use Illuminate\Support\Facades\Event;
use RoundlyConsulting\Git\Events\{WebhookReceived, PushReceived, PullRequestEventReceived};

Event::listen(PushReceived::class, function (PushReceived $event) {
    foreach ($event->commits() as $commit) {   // list<Commit>, canonical
        $commit->sha;
    }
    $event->ref();          // 'refs/heads/main' on every forge ('refs/tags/v1.0' for a tag)
    $event->repository();   // ?Repository
    $event->pusher();       // ?Author
});

Event::listen(PullRequestEventReceived::class, function (PullRequestEventReceived $event) {
    $event->pullRequest()?->state; // ResourceState
    $event->repository();          // ?Repository
    $event->action();              // raw event type
});

Event::listen(WebhookReceived::class, function (WebhookReceived $event) {
    $event->event->provider;       // ProviderName
    $event->event->type;           // e.g. 'push', 'Merge Request Hook', 'repo:push'
    $event->event->payload();      // the decoded body (also ->raw())
});
```

- WebhookReceived — pri každom overenom doručení, nesie WebhookEvent (provider, type, payload).
- PushReceived — pushe vetiev aj tagov na každej platforme vrátane Tag Push Hook z GitLabu: commits(), ref(), repository(), pusher().
- PullRequestEventReceived — udalosti pull/merge requestov: pullRequest(), repository(), action().

pullRequest() na WebhookEvent je null, pokiaľ doručenie nenesie pull request — na GitHube udalosti pull requestu, review a komentára v review, na Bitbuckete udalosti pull requestu a komentárov a na GitLabe Merge Request Hook, Note Hook k merge requestu alebo Pipeline Hook pipeline merge requestu; hooky issues, ostatných komentárov, pipeline vetiev a pushov vrátia null. Hooky GitLabu nesú menej než API: autorom je používateľ, ktorý udalosť spustil, len ak merge request aj vytvoril, merge request z Note Hook nemá url a ten z pipeline nemá body, autora ani príznak draft a jeho createdAt je čas mapovania. repository() z hooku GitLabu je len zjednodušený obraz — owner->id je '', ak hook nenesie namespace\_id, createdAt je čas mapovania a lastActivityAt vlastný čas udalosti hooku —, celý záznam repozitára preto načítajte cez API.

## Overenie

| Platforma | Kontrola podpisu | Hlavička udalosti | Typy push / PR |
| --- | --- | --- | --- |
| GitHub | `X-Hub-Signature-256: sha256=<HMAC>` | `X-GitHub-Event` | push / pull\_request |
| GitLab | `X-Gitlab-Token (zdieľané tajomstvo)` | `X-Gitlab-Event` | Push Hook, Tag Push Hook / Merge Request Hook |
| Bitbucket | `X-Hub-Signature: sha256=<HMAC>` | `X-Event-Key` | repo:push / pullrequest:created, updated, fulfilled, rejected |

Chýbajúci alebo neplatný podpis — prípadne nenastavené tajomstvo pre daného providera — vráti 403 a nedoručí nič; neznámy provider vráti 404. HMAC sa počíta zo surového tela požiadavky a porovnáva v konštantnom čase cez crypto-for-laravel, takže sfalšovaný payload sa k listenerom nikdy nedostane a čiastočne správny podpis nič neprezradí časovaním.

Webhook na GitHube môže používať ktorýkoľvek typ obsahu. Pri application/x-www-form-urlencoded — predvolenom pre webhook pridaný v rozhraní GitHubu — príde JSON v poli payload, ktoré routa dekóduje z podpísaného tela, nikdy nie z query stringu. Webhooky, ktoré vytvorí balík, používajú JSON.

## Vlastná routa

Nechajte GIT\_WEBHOOKS\_ENABLED=false a rovnakú kontrolu spustite sami:

```php
use Illuminate\Http\Request;
use RoundlyConsulting\Git\Enums\ProviderName;
use RoundlyConsulting\Git\Facades\Git;

Route::post('/hooks/github', function (Request $request) {
    abort_unless(Git::verifyWebhook(ProviderName::Github, $request), 403);

    // … your handling
});
```

verifyWebhook() číta git.providers.<name>.webhook\_secret; bez nastaveného tajomstva vráti false — neoverí sa nič, namiesto toho, aby prešlo všetko.

## Automatická registrácia

repo($path)->webhooks() prepojí prichádzajúcu routu vašej aplikácie s operáciou providera na vytvorenie webhooku: URL odvodí z routy git.webhooks, ako tajomstvo predvolene použije nastavené webhook\_secret — posiela ho každej platforme, takže doručenia sú podpísané a prejdú overením na route — a je idempotentná: webhook s rovnakou URL a rovnakými udalosťami (v ľubovoľnom poradí, aj v natívnom zápise) sa vráti bez požiadavky a nikdy sa nevytvorí dvakrát:

```php
$webhooks = Git::github()->repo('acme/api')->webhooks();

$webhooks->register();                                 // returns the existing or new Webhook
$webhooks->register(events: ['push', 'pull_request']);
$webhooks->register(url: 'https://example.com/git/webhooks/github', secret: '...');
$webhooks->all();                                      // list<Webhook>
$webhooks->registered($url);                           // bool
$webhooks->delete($webhook->id);                       // numeric id; a braced {uuid} on Bitbucket
$webhooks->deleteByUrl($url);                          // bool — whether anything was deleted
```

register() predvolene odoberá udalosť push a all() číta všetky stránky webhookov na všetkých troch platformách, takže registered() aj deleteByUrl() vidia každý z nich. register() vyhodí InvalidArgumentException a nič neodošle, ak je prijímanie vypnuté a neodovzdáte url (namiesto aby adresu hádala), ak by vlastná routa balíka dostala webhook, ktorý nevie overiť — nie je nastavené webhook\_secret alebo odovzdáte iné $secret —, a ak na danej URL už je webhook s inými udalosťami (odstráňte ho alebo zaregistrujte udalosti, ktoré má). Explicitná url môže niesť akékoľvek tajomstvo alebo žiadne.

## Názvy udalostí

Udalosti používajú na každej platforme názvy z GitHubu — push, pull\_request, issues — a každý driver sa prihlási na odber vlastných ekvivalentov:

| Udalosť | GitHub | GitLab | Bitbucket |
| --- | --- | --- | --- |
| `push` | `push` | `push_events` | `repo:push` |
| `pull_request` | `pull_request` | `merge_requests_events` | pullrequest:created, :updated, :fulfilled, :rejected |
| `issues` | `issues` | `issues_events` | — |

Natívny názov platformy prejde bez zmeny (príznak \*\_events na GitLabe, scope:action na Bitbuckete). GitLab udalosť, pre ktorú nemá príznak, odmietne s InvalidArgumentException, namiesto aby ju zahodil, a neaktívny webhook vytvoriť nevie (FeatureNotSupportedException). all() vracia udalosti pod týmito jednotnými názvami — na Bitbuckete pull\_request len vtedy, keď má webhook všetky štyri udalosti pull requestu; neúplný odber sa vypíše natívnymi názvami (pullrequest:created).

Jednotný push na GitLabe odoberá len push\_events a pushe tagov GitLab doručuje webhookom s tag\_push\_events — ak ich chcete dostávať, zaregistrujte \['push', 'tag\_push\_events'\].

## Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

[Ďalšie spôsoby podpory vrátane kryptomien](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/git-for-laravel.md)
