Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Facebook Bundle Laravel Package

armetiz/facebook-bundle

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation:

    composer require armetiz/facebook-bundle
    

    Add to AppKernel.php:

    new Armetiz\FacebookBundle\ArmetizFacebookBundle(),
    
  2. Basic Configuration (config.yml):

    armetiz_facebook:
        enabled: true
        sdk:
            default_app:
                app_id: YOUR_APP_ID
                secret: YOUR_APP_SECRET
                default: true
    
  3. First Use Case: Inject the service in a controller and fetch user data:

    use Symfony\Component\HttpFoundation\Response;
    
    class HomeController extends Controller {
        public function indexAction($facebookId, $accessToken) {
            $fb = $this->get('armetiz.facebook');
            $fb->setAccessToken($accessToken);
            $user = $fb->api("/$facebookId", 'GET');
            return new Response(json_encode($user));
        }
    }
    

Implementation Patterns

1. Multi-App Management

  • Named SDKs: Configure multiple Facebook apps in config.yml and access them via:
    $fbAppA = $this->get('armetiz.facebook.app_a');
    $fbAppB = $this->get('armetiz.facebook.app_b');
    
  • Default SDK: Set default: true in config to access via armetiz.facebook.

2. Common Workflows

Fetching User Data

$fb->setAccessToken($token);
$user = $fb->api('/me?fields=id,name,email', 'GET');

Posting to User’s Timeline

$fb->setAccessToken($token);
$fb->api('/me/feed', 'POST', ['message' => 'Hello Facebook!']);

Handling Errors

try {
    $response = $fb->api('/invalid_endpoint', 'GET');
} catch (\Facebook\Exceptions\FacebookResponseException $e) {
    // Handle HTTP errors
} catch (\Facebook\Exceptions\FacebookSDKException $e) {
    // Handle SDK errors
}

3. Integration with Symfony Components

  • Authentication: Use with Symfony’s security component to validate tokens.
  • Twig Integration: Pass SDK to templates:
    {{ dump(app.service('armetiz.facebook').api('/me', 'GET')) }}
    

4. Batch Operations

$fb->setAccessToken($token);
$friends = $fb->api('/me/friends', 'GET');
foreach ($friends['data'] as $friend) {
    $friendData = $fb->api("/$friend[id]", 'GET');
}

Gotchas and Tips

Pitfalls

  1. Token Expiry:

    • Facebook access tokens expire. Implement token refresh logic or use short-lived tokens with offline access.
    • Example refresh flow:
      $fb->setAccessToken($shortLivedToken);
      $longLivedToken = $fb->getLongLivedAccessToken($shortLivedToken);
      
  2. App Secrets in Config:

    • Avoid hardcoding secrets in config.yml. Use environment variables or Symfony’s parameter bag:
      parameters:
          facebook.app_id: %env(FACEBOOK_APP_ID)%
          facebook.app_secret: %env(FACEBOOK_APP_SECRET)%
      armetiz_facebook:
          sdk:
              default_app:
                  app_id: %facebook.app_id%
                  secret: %facebook.app_secret%
      
  3. Deprecated SDK Methods:

    • The underlying facebook/php-sdk (v3.x) is outdated. Consider migrating to facebook/graph-sdk for newer features.
  4. CORS Issues:

    • Ensure your Facebook app’s Valid OAuth Redirect URIs in the Facebook Developer Dashboard include your Symfony app’s callback URL (e.g., https://yourapp.com/connect/facebook).

Debugging Tips

  • Enable Debug Mode:
    armetiz_facebook:
        debug: true  # Logs SDK requests/responses
    
  • Check Response Codes:
    $response = $fb->api('/me', 'GET');
    if ($response->getStatusCode() !== 200) {
        throw new \RuntimeException('Facebook API error');
    }
    

Extension Points

  1. Custom SDK Initialization: Override the bundle’s compiler pass to inject custom SDK configurations:

    // src/DependencyInjection/Compiler/FacebookPass.php
    public function process(\Symfony\Component\DependencyInjection\ContainerBuilder $container) {
        $definition = $container->findDefinition('armetiz.facebook');
        $definition->addMethodCall('setCustomConfig', [['your_key' => 'value']]);
    }
    
  2. Event Listeners: Subscribe to Facebook SDK events (e.g., Facebook\BaseFacebook::LOGGED_OUT_EVENT):

    // src/EventListener/FacebookListener.php
    public function onFacebookLoggedOut($event) {
        // Handle logout logic
    }
    

    Register in services.yml:

    services:
        app.facebook_listener:
            class: AppBundle\EventListener\FacebookListener
            tags:
                - { name: kernel.event_listener, event: Facebook\BaseFacebook::LOGGED_OUT_EVENT, method: onFacebookLoggedOut }
    
  3. Caching Responses: Cache API responses to reduce calls:

    $cache = $this->get('cache.app');
    $key = 'facebook_user_' . $facebookId;
    if (!$cache->has($key)) {
        $user = $fb->api("/$facebookId", 'GET');
        $cache->set($key, $user, 3600); // Cache for 1 hour
    } else {
        $user = $cache->get($key);
    }
    

Performance Considerations

  • Batch API Calls: Use /me/friends?fields=id,name to fetch minimal data.
  • Async Requests: For non-critical data, consider using Symfony’s Messenger component to queue Facebook API calls.

Security

  • Validate Tokens: Always verify tokens server-side. Avoid client-side validation.
  • Use App Secrets: Never expose app_secret in client-side code. Use it only server-side for token validation:
    $fb->setAppId($appId);
    $fb->setAppSecret($appSecret);
    $fb->validateAppId(); // Validates the token's app ID
    
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
emuniq/filament-browser-notifications
syriable/filament-translator
hungnm28/livewire-form
wenprise/eloquent
crudly/encrypted
fadion/bouncy
cuci/prototurk-sdk
gos/pubsub-router-bundle
cuci/prototurk-sdk-symfony
clementtalleu/easyadmin-markdown-bundle
codeflextech/permission-manager
karnoweb/livewire-datepicker
sayedenam/sayed-dashboard
milito/query-filter
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui