Installation
composer require beeketing/tracker-hub-bundle
Add the bundle to config/bundles.php:
return [
// ...
Beeketing\TrackerHubBundle\BeeketingTrackerHubBundle::class => ['all' => true],
];
Configuration
Define your tracker clients in config/packages/bk_tracker_hub.yaml:
bk_tracker_hub:
clients:
mixpanel:
write_token: '%env(MIXPANEL_WRITE_TOKEN)%'
customerio:
site_id: '%env(CUSTOMER_IO_SITE_ID)%'
api_key: '%env(CUSTOMER_IO_API_KEY)%'
First Use Case
Inject TrackerHub service into a controller or service:
use Beeketing\TrackerHubBundle\TrackerHub;
public function __construct(private TrackerHub $trackerHub) {}
public function trackUserEvent(User $user, string $event, array $properties = []): void
{
$this->trackerHub->identify($user->id, [
'email' => $user->email,
'name' => $user->name,
]);
$this->trackerHub->track($user->id, $event, $properties);
}
User Identification
identify() to set user traits upfront (e.g., signup, profile updates).$this->trackerHub->identify($userId, [
'plan' => $user->subscription->plan,
'last_active' => now()->toDateTimeString(),
]);
Event Tracking
track() (e.g., clicks, purchases, form submissions).$this->trackerHub->track($userId, 'Checkout Started', [
'cart_value' => $order->total,
'items' => count($order->items),
]);
Batch Processing
$this->trackerHub->queueTrack($userId, 'Page View', ['page' => 'home']);
// Process later via a queue worker (e.g., Symfony Messenger)
Symfony Events
Bind to Symfony events (e.g., Kernel::TERMINATE) to track page views:
$eventDispatcher->addListener(Kernel::TERMINATE, function (Request $request) {
$this->trackerHub->track('anonymous', 'Page View', [
'path' => $request->getPathInfo(),
]);
});
Doctrine Lifecycle Callbacks
Track entity changes (e.g., postPersist for new users):
use Doctrine\ORM\Event\LifecycleEventArgs;
public function postPersist(User $user, LifecycleEventArgs $args): void
{
$this->trackerHub->identify($user->id, [
'signup_method' => 'web',
'created_at' => $user->createdAt->format('Y-m-d'),
]);
}
Middleware for API Tracking Wrap API requests to track endpoints:
public function handle(Request $request, Closure $next)
{
$this->trackerHub->track('api_user', 'API Request', [
'endpoint' => $request->getPathInfo(),
'method' => $request->getMethod(),
]);
return $next($request);
}
Configuration Overrides
bk_tracker_hub config is merged correctly in config/packages/. Use !imports to override defaults:
imports:
- { resource: 'config/packages/bk_tracker_hub.yaml' }
Queue Dependencies
queueTrack(), ensure your queue system (e.g., RabbitMQ, Symfony Messenger) is configured. Unprocessed events may pile up silently.API Rate Limits
$this->trackerHub->track($userId, 'Event', $properties, [
'retry_after' => 5, // seconds
]);
Anonymous Users
anonymous_${request->getClientIp()}) for unauthenticated users to avoid duplicate tracking.Enable Debug Mode
Set debug: true in config to log failed requests:
bk_tracker_hub:
debug: true
Check logs in var/log/dev.log.
Mocking for Tests
Use a custom TrackerHub service in tests:
$this->container->set('tracker_hub', $this->createMock(TrackerHub::class));
Custom Clients Extend the bundle to support additional trackers (e.g., Amplitude, PostHog):
// src/Service/CustomTrackerClient.php
class CustomTrackerClient implements TrackerClientInterface
{
public function track(string $userId, string $event, array $properties): void
{
// Custom logic
}
}
Register in services.yaml:
services:
App\Service\CustomTrackerClient:
tags: ['tracker_hub.client']
Event Transformers Modify event data before sending:
$this->trackerHub->track($userId, 'Event', $properties, [
'transformer' => function (array $data) {
$data['sanitized'] = strtolower($data['original'] ?? '');
return $data;
},
]);
Environment-Specific Clients Disable trackers in staging/dev:
bk_tracker_hub:
clients:
mixpanel:
write_token: '%env(MIXPANEL_WRITE_TOKEN)%'
enabled: '%kernel.debug%'
How can I help you explore Laravel packages today?