facebook / facebook-php-business-sdk

PHP SDK for Meta Marketing API
https://developers.facebook.com/docs/business-sdk
Other
836 stars 518 forks source link

Static singletons used everywhere #604

Open stevebauman opened 5 months ago

stevebauman commented 5 months ago

I'm working on an application that will facilitate reporting against multiple Meta integrations during the same request, but I quickly discovered that this is will cause issues if you keep one integration in memory and call it later after another one has been initialized. For example:

use FacebookAds\Api;

$one = Api::init(...);

$two = Api::init(...); // Overwrites the first

$one->... // API calls will now actually occur on $two

I thought there would be a way around this by setting the HTTP client inside of the EventRequest manually:

https://github.com/facebook/facebook-php-business-sdk/blob/f3eb099fa895ff6b5ddd98ba993982c2803b22d3/src/FacebookAds/Object/ServerSide/EventRequest.php#L214-L217

But then the singletons are called regardless later on:

https://github.com/facebook/facebook-php-business-sdk/blob/f3eb099fa895ff6b5ddd98ba993982c2803b22d3/src/FacebookAds/Object/ServerSide/EventRequest.php#L309-L313 https://github.com/facebook/facebook-php-business-sdk/blob/f3eb099fa895ff6b5ddd98ba993982c2803b22d3/src/FacebookAds/Object/ServerSide/EventRequest.php#L316-L320

Why is this the case? Why do all these static PHP singletons need to exist? This will surely cause issues for anyone running a PHP application from memory (Swoole, FrankenPHP, RoadRunner, etc.).

norberttech commented 3 months ago

I'm facing similar problem...

@stevebauman did you managed to find a solution for that?

stevebauman commented 3 months ago

@norberttech No I haven't unfortunately.

I'm considering just using raw HTTP calls to their API instead. Doesn't seem like there's an easy way with this SDK without extending a bunch of classes and overriding a ton of methods.

norberttech commented 3 months ago

yeah, I was thinking the same but it also seems that joelbutcher/facebook-graph-sdk works fine, I just tested fetching campaigns and it works, plus it's not a singleton so multitenancy is doable.

$fb = new \Facebook\Facebook([
  'app_id' => $authConfig['app_id'],
  'app_secret' => $authConfig['app_secret'],
  'default_graph_version' => $authConfig['api_version'],
  'default_access_token' => 'long_living_access_token',
  'http_client_handler' => new GuzzleHttpClient(...), // you can also inject your custom client in case you would like to mock responses
]);

$accountsData = $facebook->get('/me/adaccounts')->getDecodedBody();
$campaignsData = $facebook->get($accountsData['data'][0]['id'] . '/campaigns')->getDecodedBody();

I'm considering just using raw HTTP calls to their API instead.

Yeah, in case of any issues with this sdk I'm probably also gonna look into simple http request/response that would return associative arrays.