UserData::normalize() fatals: Class "FacebookAds\PII_DATA_TYPE" not found (v25.0.2)
EventRequest::execute() throws Class "FacebookAds\PII_DATA_TYPE" not found whenever the caller did not also call Event::setRequestContext(). Introduced in v25.0.2 by the new facebook/capi-param-builder-php: ^1.3.1 dependency (commit 04cb9b5). v25.0.0 and v25.0.1 are unaffected.
Versions
facebook/php-business-sdk 25.0.2
facebook/capi-param-builder-php 1.3.1
- PHP 8.5 / Composer 2.10.1
composer install --no-dev --optimize-autoloader
Reproducer
require __DIR__ . '/vendor/autoload.php';
use FacebookAds\Api;
use FacebookAds\Object\ServerSide\{ActionSource, Event, EventRequest, UserData};
Api::init(null, null, 'TOKEN');
$ud = (new UserData())->setEmail('test@example.com');
$ev = (new Event())
->setEventName('Lead')
->setEventTime(time())
->setUserData($ud)
->setActionSource(ActionSource::WEBSITE);
(new EventRequest('PIXEL_ID'))->setEvents([$ev])->execute();
PHP Fatal error: Uncaught Error: Class "FacebookAds\PII_DATA_TYPE" not found
in vendor/facebook/php-business-sdk/src/FacebookAds/Object/ServerSide/UserData.php:936
Adding $ev->setRequestContext($anyContext); before execute() makes the fatal go away.
Cause
UserData.php line 28 imports use FacebookAds\PII_DATA_TYPE; and references PII_DATA_TYPE::EMAIL etc. inside normalize() (lines 936-946).
PII_DATA_TYPE lives in capi-param-builder-php/php/capi-param-builder/src/model/Constants.php under namespace FacebookAds;. The package declares PSR-4 as "FacebookAds\\": "php/capi-param-builder/src/", which means Composer looks for the class at …/src/PII_DATA_TYPE.php and can't find it.
The class only becomes available as a side effect of ParamBuilder.php being autoloaded — it does require_once 'model/Constants.php' at the top. ParamBuilder is instantiated only inside Event::setRequestContext() (Event.php:639). Callers that pre-populate UserData and skip setRequestContext() never trigger that load, and UserData::normalize() fatals on the first PII_DATA_TYPE:: reference.
Fix
Add a files autoload entry to facebook/capi-param-builder-php's composer.json:
"autoload": {
"psr-4": { "FacebookAds\\": "php/capi-param-builder/src/" },
"files": [ "php/capi-param-builder/src/model/Constants.php" ]
}
Or move model/Constants.php to a PSR-4-compliant path. Either way FacebookAds\PII_DATA_TYPE becomes loadable without depending on ParamBuilder being instantiated first.
Workaround for users on v25.0.2
"facebook/php-business-sdk": "~25.0.0,<25.0.2"
UserData::normalize()fatals:Class "FacebookAds\PII_DATA_TYPE" not found(v25.0.2)EventRequest::execute()throwsClass "FacebookAds\PII_DATA_TYPE" not foundwhenever the caller did not also callEvent::setRequestContext(). Introduced in v25.0.2 by the newfacebook/capi-param-builder-php: ^1.3.1dependency (commit04cb9b5). v25.0.0 and v25.0.1 are unaffected.Versions
facebook/php-business-sdk25.0.2facebook/capi-param-builder-php1.3.1composer install --no-dev --optimize-autoloaderReproducer
Adding
$ev->setRequestContext($anyContext);beforeexecute()makes the fatal go away.Cause
UserData.phpline 28 importsuse FacebookAds\PII_DATA_TYPE;and referencesPII_DATA_TYPE::EMAILetc. insidenormalize()(lines 936-946).PII_DATA_TYPElives incapi-param-builder-php/php/capi-param-builder/src/model/Constants.phpundernamespace FacebookAds;. The package declares PSR-4 as"FacebookAds\\": "php/capi-param-builder/src/", which means Composer looks for the class at…/src/PII_DATA_TYPE.phpand can't find it.The class only becomes available as a side effect of
ParamBuilder.phpbeing autoloaded — it doesrequire_once 'model/Constants.php'at the top.ParamBuilderis instantiated only insideEvent::setRequestContext()(Event.php:639). Callers that pre-populateUserDataand skipsetRequestContext()never trigger that load, andUserData::normalize()fatals on the firstPII_DATA_TYPE::reference.Fix
Add a
filesautoload entry tofacebook/capi-param-builder-php'scomposer.json:Or move
model/Constants.phpto a PSR-4-compliant path. Either wayFacebookAds\PII_DATA_TYPEbecomes loadable without depending onParamBuilderbeing instantiated first.Workaround for users on v25.0.2