PHP code example of spatie / laravel-github-webhooks
1. Go to this page and download the library: Download spatie/laravel-github-webhooks library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
spatie / laravel-github-webhooks example snippets
namespace App\Jobs\GitHubWebhooks;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\GitHubWebhooks\Models\GitHubWebhookCall;
class HandleIssueOpenedWebhookJob implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
public GitHubWebhookCall $gitHubWebhookCall;
public function __construct(
public GitHubWebhookCall $webhookCall
) {}
public function handle()
{
// React to the issue opened at GitHub event here
// You can access the payload of the GitHub webhook call with `$this->webhookCall->payload()`
}
}
use Spatie\GitHubWebhooks\Models\GitHubWebhookCall;
use Spatie\GitHubWebhooks\Jobs\ProcessGitHubWebhookJob;
use Spatie\WebhookClient\WebhookProfile\ProcessEverythingWebhookProfile;
return [
/*
* GitHub will sign each webhook using a secret. You can find the used secret at the
* webhook configuration settings: https://docs.github.com/en/developers/webhooks-and-events/webhooks/about-webhooks.
*/
'signing_secret' => env('GITHUB_WEBHOOK_SECRET'),
/*
* You can define the job that should be run when a certain webhook hits your application
* here.
*
* You can find a list of GitHub webhook types here:
* https://docs.github.com/en/developers/webhooks-and-events/webhooks/webhook-events-and-payloads.
*
* You can use "*" to let a job handle all sent webhook types
*/
'jobs' => [
// 'ping' => \App\Jobs\GitHubWebhooks\HandlePingWebhook::class,
// 'issues.opened' => \App\Jobs\GitHubWebhooks\HandleIssueOpenedWebhookJob::class,
// '*' => \App\Jobs\GitHubWebhooks\HandleAllWebhooks::class
],
/*
* This model will be used to store all incoming webhooks.
* It should be or extend `Spatie\GitHubWebhooks\Models\GitHubWebhookCall`
*/
'model' => GitHubWebhookCall::class,
/*
* When running `php artisan model:prune` all stored GitHub webhook calls
* that were successfully processed will be deleted.
*
* More info on pruning: https://laravel.com/docs/8.x/eloquent#pruning-models
*/
'prune_webhook_calls_after_days' => 10,
/*
* The classname of the job to be used. The class should equal or extend
* Spatie\GitHubWebhooks\ProcessGitHubWebhookJob.
*/
'job' => ProcessGitHubWebhookJob::class,
/**
* This class determines if the webhook call should be stored and processed.
*/
'profile' => ProcessEverythingWebhookProfile::class,
/*
* When disabled, the package will not verify if the signature is valid.
* This can be handy in local environments.
*/
'verify_signature' => env('GITHUB_SIGNATURE_VERIFY', true),
];
namespace App\Jobs\GitHubWebhooks;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\GitHubWebhooks\Models\GitHubWebhookCall;
class HandleIssueOpenedWebhookJob implements ShouldQueue
{
use InteractsWithQueue, Queueable, SerializesModels;
public GitHubWebhookCall $gitHubWebhookCall;
public function __construct(
public GitHubWebhookCall $webhookCall
) {}
public function handle()
{
// do your work here
// you can access the payload of the webhook call with `$this->webhookCall->payload`
}
}
// config/github-webhooks.php
'jobs' => [
'issues.opened' => \App\Jobs\GitHubWebhooks\HandleIssueOpenedWebhookJob::class, // will be called when issues are opened
'issues' => \App\Jobs\GitHubWebhooks\HandleIssuesWebhookJob::class, // will be called when issues are opened, created, deleted, ...
'*' => \App\Jobs\GitHubWebhooks\HandleAllWebhooksJob::class, // will be called when any event/action comes in
],
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'github-webhooks::issues.opened' => [
App\Listeners\IssueOpened::class,
],
];
namespace App\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue;
use Spatie\GitHubWebhooks\Models\GitHubWebhookCall;
class IssueOpened implements ShouldQueue
{
public function handle(GitHubWebhookCall $webhookCall)
{
// do your work here
// you can access the payload of the webhook call with `$webhookCall->payload`
}
}
use Spatie\GitHubWebhooks\Models\GitHubWebhookCall;
use Spatie\GitHubWebhooks\Jobs\ProcessGitHubWebhookJob;
dispatch(new ProcessGitHubWebhookJob(GitHubWebhookCall::find($id)));
use Spatie\GitHubWebhooks\Jobs\ProcessGitHubWebhookJob;
class MyCustomGitHubWebhookJob extends ProcessGitHubWebhookJob
{
public function handle()
{
// do some custom stuff beforehand
parent::handle();
// do some custom stuff afterwards
}
}
use Illuminate\Http\Request;
use Spatie\WebhookClient\Models\WebhookCall;
use Spatie\WebhookClient\WebhookProfile\WebhookProfile;
class GitHubWebhookProfile implements WebhookProfile
{
public function shouldProcess(Request $request): bool
{
return ! WebhookCall::where('payload->id', $request->get('id'))->exists();
}
}