当前位置:  开发笔记 > 编程语言 > 正文

如何将Facebook PHP SDK与Laravel 5.4集成?

如何解决《如何将FacebookPHPSDK与Laravel5.4集成?》经验,为你挑选了1个好方法。

我正在寻找一种将Facebook PHP SDK与Laravel 5.4 集成的简单方法.基本上,我想在我的Laravel应用程序中将其作为服务提供.当然在github上有SammyK/LaravelFacebookSdk.但由于某种原因,我不想使用它.我觉得设置是添加另一个我必须理解的层,并在约束内工作.

还有Laravel自己的Socialite套餐.但这主要是为了简单的身份验证.如果我想上传照片,评论,批量请求,这些都是不可能的.Socialite不使用Facebook的PHP SDK作为依赖项.它使用Guzzle包仅为身份验证提供直接API请求.

由于没有简单的SO答案可以用最少的步骤直接集成Facebook SDK,我想我会写这个.



1> Adam Rangana..:

首先,在项目的根文件夹中编辑composer.json以包含Facebook SDK:

{
  "require" : {
    "facebook/graph-sdk" : "~5.0"
  }
}

接下来composer update在shell提示符下运行以将sdk拉入vendor文件夹.

现在我们想在我们的应用程序中使用Facebook SDK作为服务提供商.但在此之前,让我们设置我们的app_id,app_secret以及default_graph_version在向Facebook API发出请求时所需的参数.可以通过在Facebook Developers网站注册获得app_id和app_secret .

一旦我们从Facebook获得这些凭据,我们现在将.env在项目的根文件夹中编辑文件.将它们添加到最后:

FACEBOOK_APP_ID=xxxxxxxxxxxxxxxx
FACEBOOK_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
FACEBOOK_DEFAULT_GRAPH_VERSION=v2.8

将xxx ..替换为提供给您的值.请注意,变量名称只是我自己创建的.您可以随心所欲地命名它们.我们现在必须使用这些变量来设置单独的配置文件.我们需要这样做,以便我们可以使用Laravel的config()辅助函数在应用程序中的任何位置检索值.所以让我们在config文件夹中创建facebook.php并添加以下内容:

 [
        'app_id' => env('FACEBOOK_APP_ID', null),
        'app_secret' => env('FACEBOOK_APP_SECRET', null),
        'default_graph_version' => env('FACEBOOK_DEFAULT_GRAPH_VERSION', 'v2.8'),
    ],
];

通过这种简单的设置,我们现在可以config('facebook.config')从应用程序的任何位置进 它将返回数组以及.env文件中匹配的相关值.

现在让我们将其设置为服务提供者,这样我们就不必在每次调用Facebook API时都检索这些凭据并构建新的Facebook对象.

在Laravel 5.4中,打开文件app\Providers\AppServiceProvider.php.如果您没有此文件或想要单独创建一个文件,那么您可以在shell上创建一个新的服务提供者:

php artisan make:provider FacebookServiceProvider

我们现在可以FacebookServiceProvider.php在Providers文件夹中进行编辑.唯一的区别是我们需要在我们的config/app.php文件中注册它.您可以在$providers数组的末尾添加以下内容:

App\Providers\FacebookServiceProvider::class,

要继续使用相关代码,请在AppServiceProvider.php我们的新版本或新版本中FacebookServiceProvider.php首先包含:use Facebook\Facebook;顶部.然后在register() method添加以下内容:

$this->app->singleton(Facebook::class, function ($app) {
            return new Facebook(config('facebook.config'));
        });

你可能会注意到我正在绑定类,singleton因为对于我的应用程序,我想从服务容器中重用相同的对象.还有其他类型的绑定由Laravel前提是你可能要退房.

整个代码如下所示(我正在使用AppServiceProvider.php):

app->singleton(Facebook::class, function ($app) {
            return new Facebook(config('facebook.config'));
        });
    }
}

就是这样.我们现在有Facebook可用作该应用程序的服务.我们现在可以在我们的应用程序中的任何地方注入 facebook对象.从这里可以简单地按照Facebook文档中的说明调用他们的API.

额外的东西,就像一个例子:

在开始之前,我想提一提,我发现了一系列在Symfony的乡亲们撰写的文章中是非常有助于理解的概念Service ContainerDependency Injection.你可以在这里找到它们

我们现在尝试做一个基本的操作,比如从facebook上检索一个人的名字.为了获得有关facebook用户的信息,我们需要通过发送基本参数来调用Facebook API:用户的facebook ID以及访问令牌.让我们把这些uidaccess_token分别.您需要使用Facebook的一种方法检索这些:

    FacebookRedirectLoginHelper - 当您希望从服务器端进行facebook身份验证时.

    FacebookCanvasHelper - 用于客户端基于画布的应用程序身份验证

    FacebookJavaScriptHelper - 用于客户端javascript身份验证

您可以按照Facebook 入门指南中提供的步骤设置所需的身份验证类型.

我的应用程序非常简单,所以我使用客户端javascript身份验证.我也在旁边使用jquery.由于我使用Laravel的刀片引擎,我的javascript直接嵌入到视图文件中,因此我可以包含Laravel csrf_token()并使用其他辅助函数,例如url().客户端javascript如下所示.请记住替换appId为您的值并将文件另存为login.blade.php.



    







如果您的应用具有用户需要的不同权限集,请编辑该scope字段.对于所有可用的Facebook权限在这里看到.

所以基本上,我的代码有一个登录按钮,当用户点击它时,javascript sdk启动并弹出一个登录窗口.用户登录后,我将数据发布回服务器,就像发布表单一样.

现在回到服务器端,因为我们uidaccess_token我们可以将这些存储到数据库中,然后使我们的服务器给Facebook API的简单调用.设置路径routes/web.php以接收表单数据:

Route::post('login', 'FacebookUser@store');

FacebookUser在shell上制作控制器:

php artisan make:controller FacebookUser

控制器的代码如下:

 $uid]); 

        // get long term access token for future use
        $oAuth2Client = $fb->getOAuth2Client();

        // assuming access_token field to exist in users table in database
        $user->access_token = $oAuth2Client->getLongLivedAccessToken($access_token)->getValue();
        $user->save();

        // set default access token for all future requests to Facebook API            
        $fb->setDefaultAccessToken($user->access_token);

        // call api to retrieve person's public_profile details
        $fields = "id,cover,name,first_name,last_name,age_range,link,gender,locale,picture,timezone,updated_time,verified";
        $fb_user = $fb->get('/me?fields='.$fields)->getGraphUser();
        dump($fb_user);
    }    
}

请注意,通过使用setDefaultAccessToken()$ fb对象,可以在应用程序代码库的后续处理的任何部分中从服务容器中检索.$ fb可以直接用于发出Facebook API请求.无需使用app_id,app_secret再次构建$ fb,并且无需在当前请求 - 响应生命周期内为当前用户再次设置访问令牌.这是因为$ fb是单例,因此在当前请求 - 响应生命周期中为Facebook服务调用服务容器时返回相同的对象.

如果你无法进行方法注入来获取$ fb对象,那么还有其他解决方法.我个人最喜欢的是使用resolve()帮助器,因为无论对象上下文或类中的静态函数如何它都可以工作.

$fb = resolve('Facebook\Facebook');


这个答案被低估了
推荐阅读
N个小灰流_701
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有