NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky

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-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:

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

PlatformaKontrola podpisuHlavička udalostiTypy push / PR
GitHubX-Hub-Signature-256: sha256=<HMAC>X-GitHub-Eventpush / pull_request
GitLabX-Gitlab-Token (zdieľané tajomstvo)X-Gitlab-EventPush Hook / Merge Request Hook
BitbucketX-Hub-Signature: sha256=<HMAC>X-Event-Keyrepo: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 deleted

register() 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ťGitHubGitLabBitbucket
pushpushpush_eventsrepo:push
pull_requestpull_requestmerge_requests_eventspullrequest:created, :updated, :fulfilled, :rejected
issuesissuesissues_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 kryptomien

Odoslaní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.