Как я могу отправить пост на Facebook с контроллера при использовании laravel / socialite и facebook / graph-sdk? - PullRequest
2 голосов
/ 27 февраля 2020

Я знаю, что для опытных Laravel разработчиков этот вопрос звучит глупо, но я следовал этой статье для реализации Facebook SDK.

Я следовал всему, начиная с добавления нового столбца токенов в базу данных. реализации контроллера.

Это мой GraphController.php файл:

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
        }
    }
}

Это мой routes/web.php:

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

    Route::post('/page', 'GraphController@publishToPage');

});

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',
            ]);
        });
    }
}

Теперь мне нужно использовать publishToPage внутри моего PostController.php файла:

  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);
   }

Не могли бы вы предложить хороший способ сделать это отсюда?

Мне нужно еще раз извиниться, если вам кажется, что это основы Laravel, которые я должен знать, но я действительно изо всех сил пытался обдумать это, и ваши предложения действительно помогли бы мне лучше понять это.

Интеграция Уведомления в Twitter, MailChimp, OneSignal были действительно простыми, но политика ограниченного доступа Facebook делает меня довольно запутанным.

Спасибо, ребята. Я действительно ценю это!

1 Ответ

0 голосов
/ 21 марта 2020

К сожалению, Facebook до сих пор не получил разрешение на автоматическую публикацию, поэтому я не могу попробовать, если это действительно работает.

Я думаю, что нашел решение этой конкретной проблемы. Кредит поступает в Sti3bas от 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
        }
    }
}

Затем рефакторинг контроллеров:

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);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...