martinbean/facebook-php-sdk-laravel
Installation
composer require martinbean/facebook-php-sdk-laravel
Publish the config file:
php artisan vendor:publish --provider="MartinBean\Facebook\FacebookServiceProvider"
Configure .env
Add your Facebook App credentials:
FACEBOOK_APP_ID=your_app_id
FACEBOOK_APP_SECRET=your_app_secret
FACEBOOK_REDIRECT_URI=http://your-app.test/callback
First Use Case: Login with Facebook
Add the login route in routes/web.php:
Route::get('/login/facebook', 'Auth\FacebookController@redirectToFacebook')->name('facebook.login');
Route::get('/callback/facebook', 'Auth\FacebookController@handleFacebookCallback');
Create a controller:
use MartinBean\Facebook\Facades\Facebook;
public function redirectToFacebook()
{
return Facebook::getRedirectLoginUrl(['email']);
}
public function handleFacebookCallback()
{
try {
$user = Facebook::getUser();
// Handle user data (e.g., create/update Laravel user)
} catch (\Exception $e) {
return redirect('/login')->with('error', $e->getMessage());
}
}
$loginUrl = Facebook::getRedirectLoginUrl(['email', 'public_profile']);
return redirect()->to($loginUrl);
$user = Facebook::getUser();
$email = $user->getEmail();
$name = $user->getName();
$user = Facebook::getUser();
$posts = $user->getPosts();
$user->postToTimeline('Hello from Laravel!');
$response = Facebook::api('/me/feed', 'get', ['limit' => 5]);
public function handleFacebookCallback()
{
$user = Facebook::getUser();
$laravelUser = User::firstOrCreate(
['email' => $user->getEmail()],
['name' => $user->getName(), 'facebook_id' => $user->getId()]
);
Auth::login($laravelUser);
}
$loginUrl = Facebook::getRedirectLoginUrl(['email', 'user_birthday', 'user_friends']);
Middleware for Authenticated Requests: Use Laravel middleware to ensure Facebook user data is available in routes:
public function handleKernel()
{
$this->appendToMiddlewarePriority(FacebookMiddleware::class);
}
Caching Facebook Responses: Cache API responses to reduce calls:
$posts = Cache::remember("facebook_posts_{$user->getId()}", now()->addHours(1), function () use ($user) {
return $user->getPosts();
});
Logging Errors: Log Facebook API errors for debugging:
try {
$response = Facebook::api('/me');
} catch (\Exception $e) {
Log::error('Facebook API Error: ' . $e->getMessage());
}
Redirect URI Mismatch
FACEBOOK_REDIRECT_URI in .env matches the callback URL in Facebook Developer Dashboard.https://your-app.test/callback).Permissions Not Requested
email but don’t include it in the login URL, the SDK will throw an error.getRedirectLoginUrl():
$loginUrl = Facebook::getRedirectLoginUrl(['email', 'public_profile']);
Token Expiry
getLongLivedAccessToken() method to extend them.$longLivedToken = Facebook::getLongLivedAccessToken($shortLivedToken);
Deprecated SDK Methods
CORS Issues
Enable Debug Mode
Add this to your config/facebook.php:
'debug' => env('APP_DEBUG', false),
This will log detailed errors and help identify issues.
Inspect the Facebook User Object Dump the user object to see available methods:
dd(Facebook::getUser());
Check the SDK Logs
Enable logging in config/facebook.php:
'logging' => true,
Logs will appear in storage/logs/facebook.log.
Validate Token Ensure the access token is valid before making API calls:
if (Facebook::isValidAccessToken()) {
// Proceed with API calls
}
Custom User Model
Extend the FacebookUser class to add custom methods:
namespace App\Services;
use MartinBean\Facebook\FacebookUser as BaseFacebookUser;
class CustomFacebookUser extends BaseFacebookUser
{
public function getCustomField()
{
return $this->getGraphNode('/me/custom_field');
}
}
Bind it in a service provider:
Facebook::extend('custom', function () {
return new CustomFacebookUser();
});
Override API Requests
Extend the Facebook facade to add custom API endpoints:
Facebook::extend('customApi', function ($path, $method = 'GET', $params = []) {
return Facebook::getClient()->request($method, $path, $params);
});
Webhook Handling
Use Laravel’s HasApiTokens trait to handle Facebook webhooks:
public function handleWebhook(Request $request)
{
$data = $request->json()->all();
// Process webhook data (e.g., page subscriptions)
}
Testing Mock the Facebook SDK in tests:
Facebook::shouldReceive('getUser')->andReturn($mockUser);
How can I help you explore Laravel packages today?