laravel / socialite 및 facebook / graph-sdk를 사용하는 동안 컨트롤러에서 Facebook 페이지 게시물을 보내려면 어떻게해야합니까?

Banik

경험 많은 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',
            ]);
        });
    }
}

이제 PostController.php파일 내에서 publishToPage를 사용해야 합니다.

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

여기에서 좋은 방법을 제안 해 주시겠습니까?

이것이 내가 알아야 할 라 라벨의 기본을 좋아하는 것 같으면 다시 사과해야합니다.하지만 저는이 문제에 대해 머리를 감싸기 위해 정말 고군분투하고 있으며 여러분의 제안은 제가 그것을 더 잘 이해하는 데 정말로 도움이 될 것입니다.

Twitter, MailChimp, OneSignal 알림을 통합하는 것은 정말 쉬웠지만 Facebook의 제한된 정책으로 인해 상당히 혼란 스러웠습니다.

감사합니다. 정말 감사!

Banik

안타깝게도 Facebook은 여전히 ​​자동 게시 권한을 얻지 못해 실제로 작동하면 시도 할 수 없습니다.

그래도이 특정 문제에 대한 해결책을 찾은 것 같습니다. 신용은 Laracast의 Sti3bas로 이동합니다.

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

그런 다음 refact 컨트롤러 :

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

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관