Summary
Collectors gather data by subscribing to MVC-specific event names, so nothing collects under ADR or any non-MVC stack. Introduce a neutral seam - a canonical debug-bar signal set, a per-framework bridge, and a direct push API - so collectors receive data regardless of the host application's event vocabulary, or the absence of one.
Current coupling
Collectors call subscribe(ManagerInterface $eventsManager) and attach to framework event names:
DatabaseCollector → db:beforeQuery, db:afterQuery
ViewCollector → view:beforeRenderView, view:afterRenderView
RouteCollector → router:matchedRoute
ExceptionsCollector → dispatch:beforeException
CacheCollector → cache events
These names are emitted by the MVC stack. ADR fires a different vocabulary (APPLICATION_*, ADR_*, PIPELINE_*), and some hosts have no events manager at all.
Proposed direction (three layers)
- Canonical signal set owned by the bar - a small, stable vocabulary (
query, view.rendered, route.matched, request.received, response.sending). Collectors subscribe only to these.
- Per-framework bridge that maps native signals to canonical ones. The MVC bridge listens to
db:afterQuery / view:* / router:matchedRoute and re-emits canonical signals (current behavior, refactored behind the bridge). The ADR bridge listens to PIPELINE_* / APPLICATION_*, or instruments directly where no matching event exists.
- Direct push API on collectors (e.g.
record(...)) for hosts with no events manager - the bridge pushes directly.
The events manager becomes an implementation detail of the active bridge, not a hard dependency of the collectors.
Acceptance
- A collector receives data through the canonical signals with no reference to a framework-specific event name.
- The MVC bridge preserves current behavior (as used by
phalcon/vokuro), verified by the existing tests.
- A collector can be fed with no events manager present (push API).
Summary
Collectors gather data by subscribing to MVC-specific event names, so nothing collects under ADR or any non-MVC stack. Introduce a neutral seam - a canonical debug-bar signal set, a per-framework bridge, and a direct push API - so collectors receive data regardless of the host application's event vocabulary, or the absence of one.
Current coupling
Collectors call
subscribe(ManagerInterface $eventsManager)and attach to framework event names:DatabaseCollector→db:beforeQuery,db:afterQueryViewCollector→view:beforeRenderView,view:afterRenderViewRouteCollector→router:matchedRouteExceptionsCollector→dispatch:beforeExceptionCacheCollector→ cache eventsThese names are emitted by the MVC stack. ADR fires a different vocabulary (
APPLICATION_*,ADR_*,PIPELINE_*), and some hosts have no events manager at all.Proposed direction (three layers)
query,view.rendered,route.matched,request.received,response.sending). Collectors subscribe only to these.db:afterQuery/view:*/router:matchedRouteand re-emits canonical signals (current behavior, refactored behind the bridge). The ADR bridge listens toPIPELINE_*/APPLICATION_*, or instruments directly where no matching event exists.record(...)) for hosts with no events manager - the bridge pushes directly.The events manager becomes an implementation detail of the active bridge, not a hard dependency of the collectors.
Acceptance
phalcon/vokuro), verified by the existing tests.