Webhooky
Zapnite prijímanie a nastavte tajomstvo pre každého providera:
GIT_WEBHOOKS_ENABLED=true
GITHUB_WEBHOOK_SECRET=your-github-secret
GITLAB_WEBHOOK_SECRET=your-gitlab-secret
BITBUCKET_WEBHOOK_SECRET=your-bitbucket-secretPrichá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:
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: commits(), ref(), repository(), pusher().
- PullRequestEventReceived — udalosti pull/merge requestov: pullRequest(), repository(), action().
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 / 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.
Vlastná routa
Nechajte GIT_WEBHOOKS_ENABLED=false a rovnakú kontrolu spustite sami:
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 sa nikdy nevytvorí dvakrát:
$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 deletedregister() predvolene odoberá udalosť push. Ak je prijímanie vypnuté a neodovzdáte url, vyhodí InvalidArgumentException, namiesto aby adresu hádala.
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.
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 kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
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.