Installation:
composer require facebook/graph-sdk
Ensure PHP ≥ 5.4 and avoid Guzzle 6.x (use Guzzle 5.x or apply workaround).
Basic Initialization:
$fb = new \Facebook\Facebook([
'app_id' => env('FACEBOOK_APP_ID'),
'app_secret' => env('FACEBOOK_APP_SECRET'),
'default_graph_version' => 'v13.0', // Use latest stable version
]);
First Use Case:
Fetch a user’s profile (requires a valid access_token):
try {
$response = $fb->get('/me', '{access-token}');
$user = $response->getGraphUser();
return $user->getName();
} catch (\Facebook\Exceptions\FacebookResponseException $e) {
// Graph API error
} catch (\Facebook\Exceptions\FacebookSDKException $e) {
// SDK error (e.g., invalid token)
}
getRedirectLoginHelper(), getJavaScriptHelper(), etc.).GraphUser, GraphPage).Use helpers for authentication:
// Server-side (Redirect) Flow
$helper = $fb->getRedirectLoginHelper();
$loginUrl = $helper->getLoginUrl(
'https://your-app.com/callback',
['email', 'public_profile']
);
// Handle callback
$accessToken = $helper->getAccessToken();
Execute multiple API calls in parallel:
$batch = new \Facebook\FacebookBatch([
$fb->request('GET', '/me'),
$fb->request('GET', '/me/friends'),
]);
$responses = $fb->sendBatch($batch);
Upload photos/videos:
$file = new \Facebook\FacebookFile($pathToFile);
$response = $fb->post(
'/me/photos',
['source' => $file],
'{access-token}'
);
Handle paginated responses:
$request = $fb->request('GET', '/me/feed');
$response = $fb->send($request);
$paging = $response->getPaging();
$nextUrl = $paging->getNext() ?? null;
Validate signed requests (e.g., for Page subscriptions):
$signedRequest = \Facebook\FacebookSignedRequest::parse(
$_REQUEST['hub_challenge'],
$_REQUEST['hub_verify_token'],
env('FACEBOOK_APP_SECRET')
);
Replace the default client (e.g., for Guzzle 6.x):
$client = new \GuzzleHttp\Client();
$fb->setHttpClient($client);
Centralize error responses:
try {
$response = $fb->get('/protected-endpoint', $token);
} catch (\Facebook\Exceptions\FacebookResponseException $e) {
$error = $e->getResponseData();
$errorCode = $e->getErrorCode(); // e.g., 190 (Invalid OAuth token)
}
Specify per-request or default:
// Default in config
$fb = new \Facebook\Facebook(['default_graph_version' => 'v13.0']);
// Per-request
$response = $fb->get('/me', $token, ['version' => 'v2.12']);
Guzzle 6.x Incompatibility:
FacebookHttpClientInterface.Deprecated FacebookSession:
FacebookSession in favor of AccessToken. Update code to use:
$accessToken = $fb->getAccessToken();
Graph API Versioning:
v13.0).CSRF in Redirect Flow:
state parameter is validated in callbacks to prevent CSRF:
$helper->getLoginUrl($redirectUrl, $permissions, ['state' => $csrfState]);
Long-Lived Tokens:
$longLivedToken = $fb->getLongLivedAccessToken($shortLivedToken);
App Secret Proof:
$fb = new \Facebook\Facebook([
'app_id' => '...',
'app_secret' => '...',
'default_graph_version' => 'v13.0',
'app_secret_proof' => true, // Default: true in v5+
]);
Pagination Edge Cases:
getNext() and getPrevious() on GraphPaging to handle cursors./me/feed?fields=comments) requires nested field queries.File Uploads:
application/octet-stream is supported for non-image/video files.GraphVideo and specify source:
$response = $fb->post(
'/me/videos',
['source' => $file, 'title' => 'My Video'],
$token
);
Enable Debug Mode:
$fb = new \Facebook\Facebook([...], 'debug');
Logs requests/responses to storage/logs/facebook.log.
Inspect Raw Responses:
$response = $fb->get('/me');
$rawData = $response->getDecodedBody();
Test Locally:
FacebookMockHttpClient.Token Validation:
$tokenMetadata = $fb->get('/debug_token', $token, ['input_token' => $token]);
Custom HTTP Clients:
Implement FacebookHttpClientInterface for custom logic (e.g., retries, proxies).
Persistent Data:
Store tokens/state in a custom PersistentDataInterface:
$fb->setPersistentDataHandler(new CustomPersistentData());
URL Detection:
Override URL parsing with UrlDetectionInterface (e.g., for custom domains).
Graph Nodes:
Extend GraphNode for custom fields:
class CustomGraphNode extends \Facebook\GraphNodes\GraphNode {
public function getCustomField() { ... }
}
Environment Variables:
Use Laravel’s .env for credentials:
FACEBOOK_APP_ID=your_app_id
FACEBOOK_APP_SECRET=your_secret
FACEBOOK_DEFAULT_VERSION=v13.0
Caching Tokens:
Store AccessToken objects in Laravel’s cache:
cache()->put('facebook_token', $accessToken, now()->addHours(1));
Service Provider:
Bind the SDK in AppServiceProvider:
$this->app->singleton('facebook', function ($app) {
return new \Facebook\Facebook([
'app_id' => env('FACEBOOK_APP_ID'),
'app_secret' => env('FACEBOOK_APP_SECRET'),
'default_graph_version' => env('FACEBOOK_DEFAULT_VERSION'),
]);
});
Batch Requests: Reduce API calls by batching (e.g., fetch user + friends in one request).
Field Expansion: Limit fields to avoid over-fetching:
$response = $fb->get('/me', $token, ['fields' => 'id,name,email']);
**Async Upload
How can I help you explore Laravel packages today?