martin1982/facebook-graph-sdk
PHP 7.4+ Facebook Graph SDK (v7) for accessing the Facebook Platform. Install via Composer, initialize with app ID/secret, and make Graph API requests with built-in helpers for login flows and access tokens. Includes docs and PHPUnit tests.
Installation: Run composer require martin1982/facebook-graph-sdk in your Laravel project.
Service Provider: Register the SDK in config/app.php under providers:
'providers' => [
// ...
Facebook\Laravel\FacebookServiceProvider::class,
],
Configuration: Publish the config file:
php artisan vendor:publish --provider="Facebook\Laravel\FacebookServiceProvider"
Update config/facebook.php with your app_id, app_secret, and default_graph_version (e.g., v18.0).
First Use Case: Fetch a user’s profile in a controller:
use Facebook\Facebook;
use Facebook\Exceptions\FacebookResponseException;
public function getUserProfile()
{
$fb = app(Facebook::class);
try {
$response = $fb->get('/me', $this->getAccessToken());
$user = $response->getDecodedBody();
return response()->json($user);
} catch (FacebookResponseException $e) {
return response()->json(['error' => 'Graph returned an error: ' . $e->getMessage()], 500);
}
}
Authentication:
// In a callback route after Facebook redirect
$helper = $fb->getRedirectLoginHelper();
$accessToken = $helper->getAccessToken();
session(['facebook_token' => (string) $accessToken]);
$token = session('facebook_token');
API Calls:
$response = $fb->get('/me/friends', $token);
$friends = $response->getDecodedBody();
$data = ['message' => 'Hello Facebook!'];
$response = $fb->post('/me/feed', $data, $token);
$batch = new \Facebook\FacebookBatch([
$fb->request('GET', '/me'),
$fb->request('GET', '/me/friends'),
]);
$results = $fb->sendBatch($batch, $token);
Webhooks:
facebook/webhook).public function handle($request, Closure $next)
{
$input = $request->all();
$fb = app(Facebook::class);
$fb->validateWebhook($input['hub_challenge'] ?? '', $input['hub_verify_token'] ?? '');
return $next($request);
}
Pagination:
$response = $fb->get('/me/posts', $token, ['limit' => 10]);
$posts = $response->getDecodedBody();
$nextUrl = $response->getNextUrl(); // Fetch next page if needed
Laravel Integration:
FacebookServiceProvider:
$this->app->singleton(Facebook::class, function ($app) {
return new Facebook([
'app_id' => config('facebook.app_id'),
'app_secret' => config('facebook.app_secret'),
'default_graph_version' => config('facebook.default_graph_version'),
]);
});
// app/Facades/Facebook.php
namespace App\Facades;
use Illuminate\Support\Facades\Facade;
class Facebook extends Facade { protected static function getFacadeAccessor() { return 'facebook'; } }
Update config/app.php to bind the facade.Token Expiry:
getLongLivedAccessToken() method:
$shortLivedToken = session('facebook_token');
$longLivedToken = $fb->getLongLivedAccessToken($shortLivedToken);
session(['facebook_token' => (string) $longLivedToken]);
Graph API Versioning:
default_graph_version (e.g., v18.0). Facebook deprecated v2.0 in 2021.Error Handling:
catch (\Facebook\Exceptions\FacebookSDKException $e) {
// Handle SDK errors (e.g., network issues)
}
if (!$response->isSuccess()) {
throw new \Exception('Facebook API error: ' . $response->getError());
}
Rate Limiting:
$fb->setDefaultRetryPolicy(new \Facebook\RetryPolicy\ExponentialBackoffRetryPolicy());
Webhook Verification:
$fb->validateWebhook($challenge, config('facebook.verify_token'));
Logging:
$fb = new Facebook([...]);
$fb->setDefaultHttpClient(new \Facebook\HttpClients\CurlHttpClient(['debug' => true]));
\Log::debug('Facebook response:', $response->getRawResponse());
Testing:
$mockFb = Mockery::mock(Facebook::class);
$mockFb->shouldReceive('get')->andReturn(new \Facebook\GraphNodes\GraphNode(['id' => '123']));
$this->app->instance(Facebook::class, $mockFb);
Performance:
$user = cache()->remember("facebook_user_{$userId}", now()->addHours(1), function () use ($fb, $token) {
return $fb->get("/{$userId}", $token)->getDecodedBody();
});
Extensions:
class CustomFacebook extends Facebook {
public function getCustomData($path, $token) {
return $this->get("/custom/{$path}", $token);
}
}
Security:
app_secret in config. Use Laravel’s .env:
FACEBOOK_APP_SECRET=your_secret_here
Deprecation:
/me/feed is deprecated; use /me/posts instead).How can I help you explore Laravel packages today?