Installation
composer require codeplace-io/userback-bundle
Add to config/bundles.php:
return [
// ...
Codeplace\Bundle\UserbackBundle\UserbackBundle::class => ['all' => true],
];
Configuration Publish the default config:
php bin/console config:dump-reference Codeplace\UserbackBundle
Update .env with your Userback API key:
USERBACK_API_KEY=your_api_key_here
First Use Case Trigger a feedback widget on a critical page (e.g., checkout):
{% block userback_widget %}
{{ userback_widget() }}
{% endblock %}
Verify the widget appears in your browser and logs feedback to Userback.io.
Widget Integration
userback_widget() in layouts or specific templates.{% if app.request.get('_route') != 'admin_dashboard' %}
{{ userback_widget() }}
{% endif %}
Event Tracking
$this->get('userback')->trackEvent('ProductViewed', ['product_id' => 123]);
kernel.request):
# config/services.yaml
services:
App\EventListener\UserbackTracker:
tags:
- { name: kernel.event_listener, event: kernel.request, method: onKernelRequest }
User Context
$this->get('userback')->setUserContext($user->getId(), $user->getEmail());
$this->get('userback')->setUserContext(null, null, ['plan' => 'premium']);
API-Driven Features
$this->get('userback')->submitFeedback([
'message' => 'Bug report',
'screenshot' => $request->file('screenshot')->getPathname(),
]);
<script src="{{ asset('bundles/userback/js/userback.js') }}"></script>
dev:
# config/packages/userback.yaml
userback:
enabled: '%kernel.debug% ? false : true'
API Key Exposure
USERBACK_API_KEY in .env may leak in Git.ParameterBag or environment variables strictly. Avoid logging the key.Widget Initialization Race
document.addEventListener('DOMContentLoaded', function() {
Userback.init({ apiKey: '{{ app.parameters.userback.api_key }}' });
});
User Context Conflicts
setUserContext() calls overwrite data.$currentContext = $this->get('userback')->getUserContext();
$this->get('userback')->setUserContext(
$currentContext['userId'],
$currentContext['email'],
array_merge($currentContext['metadata'], ['new_key' => 'value'])
);
CORS Restrictions
config/packages/security.yaml:
cors:
paths:
'^/api/userback/*':
allow_origin: ['https://your-userback-instance.userback.io']
config/packages/monolog.yaml:
handlers:
userback:
type: stream
path: "%kernel.logs_dir%/userback.log"
level: debug
https://api.userback.io in browser dev tools.userback.event to debug lifecycle:
$eventDispatcher->addListener('userback.event', function($event) {
error_log('Userback event: ' . $event->getName());
});
Custom Feedback Forms
# templates/userback/widget.html.twig
<div class="custom-userback-widget">
{{ include('userback::_widget.html.twig') }}
</div>
UserbackService to add methods:
// src/Service/UserbackService.php
public function trackCustomEvent(string $name, array $data): void {
$this->client->post('/events', [
'event' => $name,
'data' => $data,
'api_key' => $this->apiKey,
]);
}
Webhook Handling
#[Route('/userback/webhook', name: 'userback_webhook', methods: ['POST'])]
public function handleWebhook(Request $request): Response {
$payload = json_decode($request->getContent(), true);
// Validate and process $payload
return new Response('OK');
}
X-Signature header.Feature Flags
$this->get('userback')->setFeatureFlag('new_ui', true);
How can I help you explore Laravel packages today?