stephpy/timelinebundle
StephpyTimelineBundle is a Symfony bundle for building activity streams and timelines. It lets you record and retrieve timeline entries, define custom actions, paginate results, and render user feeds or notifications in Symfony applications.
Read this first: v4.0.0 is a compatibility-only release. The sole change is "Symfony5" (PR #219) — the bundle now requires Symfony 5 and no longer supports Symfony 4. There are no new features, no deprecations, and no API changes called out. Treat this as a hard upgrade gate, not a feature upgrade.
What this package actually is: stephpy/timeline-bundle is a Symfony bundle, not a Laravel package. It provides Doctrine-backed activity-feed / timeline persistence: you push() an action into a component's timeline and read it back ordered by date. A Laravel developer will usually encounter it in one of two situations:
Minimal steps if you genuinely need the bundle (Symfony 5 host required):
composer require stephpy/timeline-bundle:^4.0 — this will fail on Symfony 4.x or PHP below the bundle's floor; that failure is the breaking change.config/packages/stephpy_timeline.yaml: action, component, timeline, timeline_action — pointing at your own Doctrine entities (or the bundle's, if you use mapped superclasses).timeline, timeline_action, etc.TimelineManager and make your first call:
$timelineManager->push($component, $action, $subject);
where $component is the timeline owner (e.g. a user), $action is the verb (e.g. "commented"), and $subject is the object acted upon.First use case to build: a per-user activity feed ("Alice commented on Post #12") — the canonical use of this bundle.
push() from a domain event listener or service, not from controllers. The manager persists rows synchronously; there is no queueing in the bundle.Component is your feed bucket. Use user:{id} semantics so one user's feed is one timeline rather than one global table scan.Action rows seeded and stable (like, comment, follow). Renaming an action row silently orphans history — treat them as append-only reference data.getTimeline($component) returns the timeline with its actions; paginate in your own repository layer rather than loading the whole feed. The bundle does not ship pagination.deleteTimeline($component) is available for GDPR-style erasure or feed reset. This is a destructive operation — wrap it in a transaction and log it.timelines (component), actions (verb lookup), timeline_actions (timeline_id, action_id, subject_type, subject_id, created_at) with a morph relation for the subject. Index (timeline_id, created_at) — that's the query you'll actually run.laravel-doctrine/orm) and treat the bundle's config as static YAML you translate into a Doctrine connection config. It will not register itself as a Laravel service provider — there is no TimelineBundleServiceProvider.^3.1 and pin it. There is no deprecation shim — the constraint simply won't resolve.composer.json constraints yourself (PHP floor and symfony/* ranges) — do not assume a patch-level-smooth bump because the version jumped 3.1.1 → 4.0.0.stephpy_timeline.drivers.orm.classes produces confusing Doctrine mapping errors rather than a clear "class not found" — the failure surfaces at schema build or first push(), not at container compile.datetime has no timezone, so mixed-offset writes will sort incorrectly.drivers.orm) is the intended seam — if you need Redis or MongoDB-backed timelines, that is where you'd implement. Given the package's low activity (one commit between 3.1.1 and 4.0.0), avoid betting on upstream driver support and plan to own any custom driver.How can I help you explore Laravel packages today?