facebook/capi-param-builder-php
Installation
composer require facebook/capi-param-builder-php
Add to composer.json under require or require-dev if testing.
First Use Case
Build a basic PageView event for Facebook's Conversions API:
use Facebook\Capi\ParamBuilder\ParamBuilder;
$builder = new ParamBuilder();
$params = $builder->pageView()
->setEventId('12345')
->setEventTime('2023-10-01T12:00:00+00:00')
->setData(array(
'currency' => 'USD',
'value' => 99.99,
))
->build();
Where to Look First
src/ParamBuilder.php (core class)src/EventTypes/ (event-specific builders like Purchase, Lead, etc.)Event Initialization Use fluent methods to chain event-specific configurations:
$purchase = $builder->purchase()
->setEventId('purchase_789')
->setEventSourceUrl('https://example.com/checkout')
->setData(array(
'contents' => array(
array(
'id' => 'prod_123',
'quantity' => 2,
),
),
));
Data Validation & Sanitization The builder auto-sanitizes inputs (e.g., trims strings, validates dates). Example:
$builder->custom()
->setEventId('custom_123')
->setCustomData(array(
'user_property' => array(
'email' => 'user@example.com', // Auto-sanitized
),
));
Batch Processing For bulk events (e.g., server-to-server API calls):
$batch = [];
foreach ($orders as $order) {
$batch[] = $builder->purchase()
->setEventId($order['id'])
->setData($order['data'])
->build();
}
// Send $batch to Facebook API in one request.
Integration with Laravel
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(ParamBuilder::class, function () {
return new ParamBuilder();
});
}
use Facebook\Capi\ParamBuilder\ParamBuilder;
public function handle(Request $request, Closure $next)
{
$builder = app(ParamBuilder::class);
$params = $builder->fromRequest($request)->build();
// Validate/process $params...
return $next($request);
}
Testing Mock the builder in unit tests:
$builder = $this->createMock(ParamBuilder::class);
$builder->method('purchase')
->willReturnSelf()
->method('setEventId')
->willReturnSelf()
->method('build')
->willReturn(['valid' => 'params']);
Event-Specific Requirements
Lead) require mandatory fields. The builder throws exceptions for missing data:
try {
$builder->lead()->build(); // Fails if no 'lead_data' is set.
} catch (InvalidArgumentException $e) {
// Handle missing fields.
}
Date/Time Formatting
2023-10-01T12:00:00+00:00). Invalid formats throw errors.use Carbon\Carbon;
$eventTime = Carbon::now()->toIso8601String();
Nested Data Structures
contents (for Purchase) must follow Facebook’s schema. Malformed data (e.g., missing id or quantity) causes validation failures.json_encode($builder->getData(), JSON_PRETTY_PRINT) to inspect raw output.Rate Limits
Deprecation Warnings
Reuse Builders Create reusable builder instances for common events:
class PurchaseBuilder
{
public function __construct(private ParamBuilder $builder) {}
public function buildFromOrder(Order $order): array
{
return $this->builder->purchase()
->setEventId($order->id)
->setData($order->toArray())
->build();
}
}
Custom Validation Extend the builder for project-specific rules:
class ExtendedParamBuilder extends ParamBuilder
{
public function validateEmail(string $email): void
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException("Invalid email: $email");
}
}
public function customEventWithEmail(): self
{
return $this->custom()
->setCustomData(['email' => $this->validateEmail(...));
}
}
Logging Log built parameters for debugging/auditing:
$params = $builder->purchase()->build();
\Log::debug('Facebook CAPI params', ['params' => $params]);
Performance
Client-Side Sync If using both server-side (PHP) and client-side (JS) builders, ensure consistent parameter naming across platforms. Example:
// PHP
$builder->purchase()->setData(['contents' => [...]]);
// JavaScript
meta.capiParamBuilder.purchase().setData({ contents: [...] });
How can I help you explore Laravel packages today?