johngrogg/ics-parser
A PHP library for parsing iCalendar (.ics) files into associative arrays of calendars and events, with DateTime support, time zone handling, and resolved property arrays. Install via Composer as johngrogg/ics-parser.
Architecture fit
.ics from a URL or storage disk, parse to arrays, map to Eloquent models. It does no HTTP, persistence, auth, or queue work — all of that is application responsibility.spatie/icalendar-generator / eluceo/ical for publishing, and treat bidirectional sync as out of scope for this package.CalendarParserInterface + DTOs (CalendarEvent, EventUid, RecurrenceSpec), with the vendor class confined to a single adapter. This is the difference between a two-day swap and a two-week migration later.Integration feasibility
composer require johngrogg/ics-parser:^3. Note the vendor is johngrogg, not the GitHub org u01jmg3 — a predictable copy/paste failure worth capturing in onboarding docs.Technical risk
RRULE/EXDATE/RECURRENCE-ID), VTIMEZONE resolution, and DST boundaries are where calendar parsers break. The library's behavior here must be verified empirically, not assumed.Key questions
RRULE into discrete instances, and does it honor EXDATE and RECURRENCE-ID overrides? What is the cost profile for an unbounded FREQ=DAILY rule?VTIMEZONE blocks and IANA identifiers resolved — to UTC, to DateTimeZone, or left as naive local strings? What happens with Windows timezone names?VALUE=DATE) versus timed and floating times represented in the returned array?Stack fit
app/Services/Calendar/ with IcsParserAdapter implements CalendarParserInterface, bound in a service provider.Migration path
sabre/vobject offers broader RFC coverage and CalDAV/vCard support behind the same interface. Budget this as a realistic eventuality, not a hedge.Compatibility
composer update blast radius.Sequencing
UID + SEQUENCE for idempotent re-import and RECURRENCE-ID for override handling.Maintenance
Support
Scaling
memory_limit and job timeouts per feed size class, and enforce a pre-parse file-size ceiling.FREQ bounds.ETag/Last-Modified. Most feeds change rarely, so avoiding re-parse is the cheapest optimization available.Failure modes
UID + SEQUENCE upserts and explicit exception deletion.Ramp-up
Recommendation: Adopt conditionally — read-only ingestion of well-understood feeds, behind an internal interface, gated on the spike. Not a foundation for bidirectional calendar sync or strict RFC 5545 compliance.
How can I help you explore Laravel packages today?