roundly-consulting / events-for-laravel
Real-world events for any Eloquent app: reusable venues with near-me search, ticket tiers priced in Money, RSVPs with a race-free waitlist, QR check-in, co-hosts and invite-only events, iCalendar feeds and schema.org JSON-LD.
Package info
github.com/roundly-consulting/events-for-laravel
pkg:composer/roundly-consulting/events-for-laravel
Fund package maintenance!
Requires
- php: ^8.4
- ext-json: *
- ext-mbstring: *
- illuminate/auth: ^12.0|^13.0
- illuminate/bus: ^12.0|^13.0
- illuminate/cache: ^12.0|^13.0
- illuminate/console: ^12.0|^13.0
- illuminate/container: ^12.0|^13.0
- illuminate/contracts: ^12.0|^13.0
- illuminate/database: ^12.0|^13.0
- illuminate/encryption: ^12.0|^13.0
- illuminate/events: ^12.0|^13.0
- illuminate/http: ^12.0|^13.0
- illuminate/notifications: ^12.0|^13.0
- illuminate/queue: ^12.0|^13.0
- illuminate/routing: ^12.0|^13.0
- illuminate/support: ^12.0|^13.0
- illuminate/validation: ^12.0|^13.0
- illuminate/view: ^12.0|^13.0
- roundly-consulting/crypto-for-laravel: ^1.2.0
- roundly-consulting/enums-for-laravel: ^1.1.0
- roundly-consulting/geolocation-for-laravel: ^2.0.4
- roundly-consulting/lifecycle-for-laravel: ^1.1.0
- roundly-consulting/media-library-for-laravel: ^1.3.1
- roundly-consulting/money-for-laravel: ^1.0.3
- roundly-consulting/package-toolkit-for-laravel: ^1.3.0
- roundly-consulting/qr-for-laravel: ^1.1.2
- roundly-consulting/query-builder-for-laravel: ^1.2.1
- roundly-consulting/sluggable-for-laravel: ^1.1.3
- roundly-consulting/tags-for-laravel: ^1.0
- roundly-consulting/translatable-for-laravel: ^1.1.2
Requires (Dev)
- larastan/larastan: ^3.0
- laravel/pint: ^1.18
- nunomaduro/collision: ^8.5
- orchestra/testbench: ^10.0|^11.0
- pestphp/pest: ^4.0
- pestphp/pest-plugin-arch: ^4.0
- pestphp/pest-plugin-laravel: ^4.0
- phpstan/extension-installer: ^1.4
- roundly-consulting/testing-for-laravel: ^1.6.1
Suggests
- roundly-consulting/attributes-for-laravel: Custom event fields (recipe)
- roundly-consulting/comments-for-laravel: Event discussion (recipe)
- roundly-consulting/reviews-for-laravel: Post-event reviews (recipe)
- roundly-consulting/teams-for-laravel: Team organizers (the Organizer recipe)
Provides
None
Conflicts
None
Replaces
None
README
Events for Laravel
Run real-world events in any Laravel app: reusable venues with near-me search, ticket types priced in Money, RSVPs with a race-free waitlist, QR check-in at the door, co-hosts and invite-only events. It is built for meetup, community, venue and ticketing apps that want the event core done right, with times stored in UTC and read in each event's own timezone.
Installation
Requires PHP 8.4, Laravel 12 or 13, MySQL 8 or PostgreSQL, and the bcmath, fileinfo, phar and zlib
extensions (plus gd or imagick for poster variants).
composer require roundly-consulting/events-for-laravel php artisan events:install php artisan migrate
Set EVENTS_KEY_TYPE to your users' key type (bigint, uuid or ulid) before migrating, and keep
EVENTS_PRIMARY_KEY_TYPE equal to lifecycle.key_type and tags.key_type. Schedule events:sweep and
lifecycle:sweep every minute (held seats expire, reminders go out, finished events complete), then run
php artisan events:doctor.
Usage
Create a venue and a category, publish an event with two ticket types, then RSVP, check in at the door and find events near you:
use RoundlyConsulting\Events\Facades\Events; use RoundlyConsulting\Money\Money; // A reusable venue: its timezone is how every wall-clock time below is read $venue = Events::venues()->make('Blue Note') ->address(street: 'Hlavná 1', city: 'Bratislava', postalCode: '811 01', country: 'SK') ->coordinates(48.1439, 17.1097) ->timezone('Europe/Bratislava') ->create(); Events::categories()->make(['en' => 'Jazz', 'sk' => 'Jazz'])->create(); // categories are curated $event = Events::make(['en' => 'Jazz Night', 'sk' => 'Jazzový večer']) ->description(['en' => 'A live quartet, then an open jam session.']) ->organizedBy($user) ->at($venue) ->startsAt('2026-11-14 20:00') // 20:00 in Bratislava, stored as UTC ->duration('3 hours') // or 'PT3H', a CarbonInterval, or ->endsAt(...) ->capacity(120) ->category('jazz') ->labels(['Live', 'Late night']) ->poster($request->file('poster')) ->tier('Free entry', key: 'free') ->tier('Supporter', price: Money::ofMajor('15', 'EUR'), capacity: 30) // key "supporter" ->publish(); // RSVP: a seat while there is one, the waitlist once it is full $rsvp = Events::for($event)->rsvp($attendee)->going(tier: 'free'); $rsvp->isGoing(); // or isWaitlisted(), isHeld() // At the door: scan the attendee's QR code, as the signed-in staff member $result = Events::for($event)->by($doorStaff)->checkIn($scannedCode); // organizers and co-hosts only $result->firstCheckIn; // false if the code was already used // Discovery: upcoming published events (cancelled ones flagged by phase) within 25 km, nearest first Events::browse()->upcoming()->near($here, km: 25)->orderByDistance($here)->paginate();
Documentation
The full documentation — configuration, every feature and its API, and testing — lives on our website: roundly-consulting.com/open-source/docs/events-for-laravel
Release notes are in CHANGELOG.md. To contribute, see the contributing guide.
Support our work
This package is free and open source, built and maintained by Roundly Consulting. If it saves you time, please consider supporting our open-source work — a one-time donation, a monthly pledge on Patreon or a crypto donation helps fund maintenance, new features and new packages.
License
The MIT License (MIT). See LICENSE.md.