facebook/php-sdk-v4
Official Facebook Graph SDK for PHP. Authenticate users, obtain access tokens via helpers, and call the Graph API to read/write Facebook data. Composer installable; v5 targets PHP 5.4+ with guidance for upgrading from v4 and Guzzle compatibility notes.
Installation:
composer require facebook/graph-sdk
Ensure PHP ≥ 5.4 and Guzzle 5.x (or use Guzzle 6.x workaround).
Basic Initialization:
$fb = new \Facebook\Facebook([
'app_id' => env('FACEBOOK_APP_ID'),
'app_secret' => env('FACEBOOK_APP_SECRET'),
'default_graph_version' => 'v12.0', // Use latest stable version
]);
First Use Case: Fetch User Profile
try {
$response = $fb->get('/me', '{user-access-token}');
$user = $response->getGraphUser();
return $user->getName();
} catch (\Facebook\Exceptions\FacebookResponseException $e) {
// Handle Graph API errors
} catch (\Facebook\Exceptions\FacebookSDKException $e) {
// Handle SDK errors
}
Facebook class: Core service for API calls.getRedirectLoginHelper(), getJavaScriptHelper(), etc., for auth flows.fileToUpload(), videoToUpload() for media handling.$helper = $fb->getRedirectLoginHelper();
$loginUrl = $helper->getLoginUrl(
'https://your-app.com/callback',
['email', 'public_profile']
);
$accessToken = $helper->getAccessToken();
if ($accessToken) {
$fb->setDefaultAccessToken($accessToken->getValue());
$user = $fb->get('/me')->getGraphUser();
}
$helper = $fb->getJavaScriptHelper();
$signedRequest = $helper->getSignedRequest();
if ($signedRequest) {
$userId = $signedRequest->getUserId();
// Validate and use $userId
}
$response = $fb->get('/me/feed', ['limit' => 10]);
$posts = $response->getGraphEdge();
while (true) {
$nextUrl = $posts->getNextUrl();
if (!$nextUrl) break;
$posts = $fb->get($nextUrl)->getGraphEdge();
}
$requests = [
$fb->request('GET', '/me'),
$fb->request('POST', '/me/feed', ['message' => 'Hello!']),
];
$batchResponse = $fb->sendBatchRequest($requests, '{access-token}');
foreach ($batchResponse as $response) {
if ($response->getStatusCode() === 200) {
// Process successful response
}
}
// Photo upload
$response = $fb->post('/me/photos', [
'source' => $fb->fileToUpload('/path/to/photo.jpg'),
'message' => 'Check this out!'
], '{access-token}');
// Video upload (chunked)
$response = $fb->uploadVideo(
'me',
'/path/to/video.mp4',
['title' => 'My Video'],
'{access-token}'
);
$pageHelper = $fb->getPageTabHelper();
$signedRequest = $pageHelper->getSignedRequest();
if ($signedRequest) {
$pageId = $pageHelper->getPageId();
$isAdmin = $pageHelper->isAdmin();
// Use $pageId and $isAdmin
}
Facebook\Webhook for handling Facebook webhook events (requires separate setup in Facebook Developer Dashboard).Deprecation Warnings:
default_graph_version and check Facebook’s API changelog.v2.10 is deprecated; use v12.0 or higher.Guzzle Version Conflicts:
Access Token Expiry:
ExchangeToken helper to extend them:
$longLivedToken = $fb->getDefaultAccessToken()->getValue();
$accessToken = $fb->getAccessTokenFromShortLivedToken($longLivedToken);
Signed Request Validation:
getRawSignedRequest() in production. Malformed requests can crash your app.$signedRequest->make($payload) for debugging.File Upload Limits:
uploadVideo()).Enable Debug Mode:
$fb = new \Facebook\Facebook([
'app_id' => '...',
'app_secret' => '...',
'default_graph_version' => 'v12.0',
'debug' => true, // Logs HTTP requests/responses
]);
Inspect Raw Responses:
$response = $fb->get('/me');
$rawResponse = $response->getRawResponse();
file_put_contents('debug.json', $rawResponse);
Handle Exceptions Gracefully:
FacebookResponseException (API errors) and FacebookSDKException (SDK issues).$e->getMessage(), $e->getResponseData()).Environment Variables:
app_id, app_secret, and tokens in .env (use env() helper in Laravel):
'app_id' => env('FACEBOOK_APP_ID'),
'default_access_token' => env('FACEBOOK_PAGE_ACCESS_TOKEN'),
CORS Issues:
App Secret Proof:
app_secret_proof to prevent CSRF:
$helper = $fb->getRedirectLoginHelper();
$loginUrl = $helper->getLoginUrl('...', ['scope'], true); // Enable proof
Custom HTTP Client:
$fb = new \Facebook\Facebook([
'http_client_handler' => function () {
return new \GuzzleHttp\Client(['debug' => true]);
},
]);
Middleware for API Calls:
\Facebook\Facebook to add pre/post-processing:
class CustomFacebook extends \Facebook\Facebook {
public function get($path, $accessToken = null) {
$response = parent::get($path, $accessToken);
// Add custom logic (e.g., caching)
return $response;
}
}
Webhook Verification:
$challenge = $_REQUEST['hub_challenge'];
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
$expectedSignature = hash_hmac('sha1', $challenge, env('FACEBOOK_WEBHOOK_SECRET'));
if ($signature !== $expectedSignature) {
http_response_code(403);
exit;
}
echo $challenge;
Batch Requests:
Caching:
/me) with Laravel’s cache:
$user = cache()->remember('facebook_user_' . $userId, 3600, function () use ($fb, $userId) {
return $fb->get("/$userId")->getGraphUser();
});
Async Uploads:
dispatch(new UploadFacebookVideo($videoPath, $userId));
How can I help you explore Laravel packages today?