如何将 Facebook PHP SDK 与 Laravel 5.4 集成? [英] How to integrate Facebook PHP SDK with Laravel 5.4?
问题描述
我一直在寻找一种将 Facebook PHP SDK 与 Laravel 5.4 集成的简单方法.本质上,我想让它在我的 Laravel 应用程序中作为服务提供.当然,github 上有 SammyK/LaravelFacebookSdk.但出于某种原因,我不想使用它.我觉得这个设置增加了另一个我必须理解的层,并在限制范围内工作.
还有 Laravel 自己的 Socialite 包.但这本质上仅用于简单的身份验证.如果我想上传照片,评论,批量请求,这些都是不可能的.Socialite 不使用 Facebook 的 PHP SDK 作为依赖项.它使用 Guzzle 包来发出仅用于身份验证的直接 API 请求.
由于没有简单的 SO 答案以最少的步骤直接集成 Facebook SDK,我想我会写这个.
首先,编辑项目根文件夹中的 composer.json 以包含 Facebook SDK:
<代码>{要求" : {facebook/graph-sdk":~5.0"}}
接下来在 shell 提示下运行 composer update
以将 sdk 拉入供应商文件夹.
现在我们想在我们的应用中使用 Facebook SDK 作为服务提供者.但在此之前,让我们设置我们的 app_id
、app_secret
和 default_graph_version
,它们是向 Facebook API 发出请求时所需的参数.app_id 和 app_secret 可以通过在 Facebook Developers 网站上注册获得.
一旦我们从 Facebook 获得这些凭据,我们现在将编辑项目根文件夹中的 .env
文件.将它们添加到最后:
FACEBOOK_APP_ID=xxxxxxxxxxxxxxxxFACEBOOK_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxFACEBOOK_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 中,打开文件 appProvidersAppServiceProvider.php
.如果你没有这个文件或者想制作一个单独的文件,那么你可以在 shell 中创建一个新的服务提供者:
php artisan make:provider FacebookServiceProvider
我们现在可以在 Providers 文件夹中编辑 FacebookServiceProvider.php
.唯一的区别是我们需要在我们的 config/app.php
文件中注册它.您将在 $providers
数组的末尾添加以下内容:
AppProvidersFacebookServiceProvider::class,
要继续使用相关代码,在 AppServiceProvider.php
或我们新的 FacebookServiceProvider.php
中,我们首先包括:use FacebookFacebook;
在顶部.然后在 register() 方法
中添加以下内容:
$this->app->singleton(Facebook::class, function ($app) {返回新的 Facebook(config('facebook.config'));});
您可能会注意到,我将类绑定为 singleton
,因为对于我的应用程序,我想重用来自服务容器的相同对象.您可能需要查看 Laravel 提供的其他类型的绑定.>
整个代码如下所示(我使用的是 AppServiceProvider.php):
app->singleton(Facebook::class, function ($app) {返回新的 Facebook(config('facebook.config'));});}}
就是这样.我们现在可以将 Facebook 作为应用程序的服务.我们现在可以注入 facebook 对象到我们想要使用的任何地方它在我们的应用程序中.从这里开始,您只需按照 Facebook 文档 中的说明调用他们的 API.'>
额外的东西,举个例子:
在继续之前,我想提一下,我发现Symfony的人写的系列帖子对理解Service Container
和Dependency Injection的概念很有帮助代码>.您可以在这里找到它们
现在让我们尝试做一个基本的操作,比如从 facebook 检索一个人的名字.为了获取有关 facebook 用户的信息,我们需要通过发送基本参数来调用 Facebook API:用户的 facebook id 以及访问令牌.让我们分别称这些为 uid
和 access_token
.您需要使用 Facebook 的一种方法来检索这些:
- FacebookRedirectLoginHelper - 当您希望从服务器端进行 Facebook 身份验证时.
- FacebookCanvasHelper - 用于基于客户端画布的应用身份验证
- FacebookJavaScriptHelper - 用于客户端 javascript 身份验证
您可以按照 Facebook 的入门<中提供的步骤设置所需的身份验证类型 指南.
我的应用程序非常简单,所以我使用了客户端 javascript 身份验证.我也同时使用 jquery.由于我使用的是 Laravel 的刀片引擎,我的 javascript 被直接嵌入到视图文件中,以便我可以包含 Laravel 的 csrf_token()
并使用其他辅助函数,例如 url()
.客户端 javascript 如下所示.请记住将 appId
替换为您的值并将文件另存为 login.blade.php
.
<头><link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>头部><身体><button id="btn-login" type="button" class="btn btn-primary btn-lg"><跨度>使用 Facebook 登录</span>按钮><脚本>$(document).ready(function() {$.ajaxSetup({ cache: true });//因为我也在我的应用程序中使用 jquery$.getScript('//connect.facebook.net/en_US/sdk.js', function () {//初始化facebook sdkFB.init({appId: 'xxxxxxxxxxxxxxxx',//用你的 id 替换它状态:真实,饼干:是的,版本:'v2.8'});//附加登录点击事件处理程序$("#btn-login").click(function(){FB.login(processLoginClick, {scope:'public_profile,email,user_friends', return_scopes: true});});});//将 uid 和 access_token 发送回服务器的函数//用户授予的实际权限也作为附加项包括在内函数 processLoginClick(响应){var uid = response.authResponse.userID;var access_token = response.authResponse.accessToken;var 权限 = response.authResponse.grantedScopes;var 数据 = { uid:uid,访问令牌:访问令牌,_token:'{{ csrf_token() }}',//这对 Laravel 接收数据很重要权限:权限};postData("{{ url('/login') }}", data, "post");}//将任何数据发布到服务器的函数函数 postData(网址,数据,方法){方法 = 方法 ||邮政";var form = document.createElement("form");form.setAttribute("方法", 方法);form.setAttribute("action", url);for(数据中的var键){if(data.hasOwnProperty(key)){var hiddenField = document.createElement("输入");hiddenField.setAttribute("类型", "隐藏");hiddenField.setAttribute("name", key);hiddenField.setAttribute("value", data[key]);form.appendChild(hiddenField);}}document.body.appendChild(form);表单提交();}