Ad

How Can I Send Facebook Page Post From Controller While Using Laravel/socialite And Facebook/graph-sdk?

- 1 answer

I know that for experienced Laravel developers this question my sound silly, but I followed this article for implementing Facebook SDK.

I followed everything from adding new token column in database to implementing controller.

This is my GraphController.php file:

class GraphController extends Controller
{
  private $api;
  public function __construct(Facebook $fb)
  {
      $this->middleware(function ($request, $next) use ($fb) {
          $fb->setDefaultAccessToken(Auth::user()->token);
          $this->api = $fb;
          return $next($request);
      });
  }

  public function getPageAccessToken($page_id){
      try {
           // Get the \Facebook\GraphNodes\GraphUser object for the current user.
           // If you provided a 'default_access_token', the '{access-token}' is optional.
           $response = $this->api->get('/me/accounts', Auth::user()->token);
      } catch(FacebookResponseException $e) {
          // When Graph returns an error
          echo 'Graph returned an error: ' . $e->getMessage();
          exit;
      } catch(FacebookSDKException $e) {
          // When validation fails or other local issues
          echo 'Facebook SDK returned an error: ' . $e->getMessage();
          exit;
      }

      try {
          $pages = $response->getGraphEdge()->asArray();
          foreach ($pages as $key) {
              if ($key['id'] == $page_id) {
                  return $key['access_token'];
              }
          }
      } catch (FacebookSDKException $e) {
          dd($e); // handle exception
      }
  }

    public function publishToPage(Request $request, $title){

        $page_id = 'XXXXXXXXXXXXX';

        try {
            $post = $this->api->post('/' . $page_id . '/feed', array('message' => $title), $this->getPageAccessToken($page_id));

            $post = $post->getGraphNode()->asArray();


        } catch (FacebookSDKException $e) {
            dd($e); // handle exception
        }
    }
}

This is my routes/web.php :

Route::group(['middleware' => [
    'auth'
]], function(){

    Route::post('/page', '[email protected]');

});

FacebookServiceProvider:


class FacebookServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->singleton(Facebook::class, function ($app) {
            $config = config('services.facebook');
            return new Facebook([
                'app_id' => $config['client_id'],
                'app_secret' => $config['client_secret'],
                'default_graph_version' => 'v2.6',
            ]);
        });
    }
}

Now, I would need to use publishToPage inside of my PostController.php file:

  public function store(Requests\PostRequest $request)
    {

          $data = $this->handleRequest($request);

          $newPost = $request->user()->posts()->create($data);
          $newPost->createTags($data["post_tags"]);

/*
             // My other notifications that are working:

              // OneSignal
              OneSignal::sendNotificationToAll(
                "New warning ".$newPost->title
              );

              // MailChimp
              $this->notify($request, $newPost);

              // Twitter
              $newPost->notify(new ArticlePublished());
*/

              // I WOULD NEED SOMETHING IN THIS WAY ALSO FOR FACEBOOK BUT THIS OBVIOUSLY DOESN'T WORK
              GraphController::publishToPage($request, $newPost->title);
   }

Can you please suggest good way how to do it from here?

I need to apologize again if this seems to you like basics of Laravel that I should know, but I really struggling to wrap my head around this and your suggestions would really help me to understand it better.

Integrating Twitter, MailChimp, OneSignal notifications was really easy but Facebook restricted policies makes it quite confusing for me.

Thank you guys. I really appreciate it!

Ad

Answer

Sadly, Facebook still didn't get me permission for auto posting so I cannot try, if it realy works.

I think I found a solution to this particular problem though. Credit goes to Sti3bas from Laracast.

namespace App\Services;

class FacebookPoster
{
   protected $api;

   public function __construct(Facebook $fb)
   {
      $fb->setDefaultAccessToken(Auth::user()->token);
      $this->api = $fb;
   }

   protected function getPageAccessToken($page_id){
      try {
           // Get the \Facebook\GraphNodes\GraphUser object for the current user.
           // If you provided a 'default_access_token', the '{access-token}' is optional.
           $response = $this->api->get('/me/accounts', Auth::user()->token);
      } catch(FacebookResponseException $e) {
          // When Graph returns an error
          echo 'Graph returned an error: ' . $e->getMessage();
          exit;
      } catch(FacebookSDKException $e) {
          // When validation fails or other local issues
          echo 'Facebook SDK returned an error: ' . $e->getMessage();
          exit;
      }

      try {
          $pages = $response->getGraphEdge()->asArray();
          foreach ($pages as $key) {
              if ($key['id'] == $page_id) {
                  return $key['access_token'];
              }
          }
      } catch (FacebookSDKException $e) {
          dd($e); // handle exception
      }
  }

   public function publishToPage($page, $title){
      try {
         $post = $this->api->post('/' . $page . '/feed', array('message' => $title), $this->getPageAccessToken($page));

         $post = $post->getGraphNode()->asArray();
        } catch (FacebookSDKException $e) {
            dd($e); // handle exception
        }
    }
}

Then refact controllers:

use App\Services\FacebookPoster;

//...

class GraphController extends Controller
{
   public function publishToPage(Request $request, FacebookPoster $facebookPoster)
   {
      $page_id = 'XXXXXXXXXXXXX';
      $title = 'XXXXXXXXXXXXX';

      $facebookPoster->publishToPage($page_id, $title);
   }
}

use App\Services\FacebookPoster;

//...

public function store(PostRequest $request, FacebookPoster $facebookPoster)
{
   $data = $this->handleRequest($request);

   $newPost = $request->user()->posts()->create($data);
   $newPost->createTags($data["post_tags"]);

   //...

   $facebookPoster->publishToPage($page, $newPost->title);
 }
Ad
source: stackoverflow.com
Ad