gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:00:25 25 4
gpt4 key购买 nike

我在寻找将Facebook PHP SDK与Laravel 5.4集成的简便方法。本质上,我想在Laravel应用程序中将其作为服务提供。当然在github上有SammyK/LaravelFacebookSdk。但是由于某种原因,我不想使用它。我觉得安装程序增加了我必须理解的另一层,并且在限制内工作。

还有Laravel自己的Socialite包。但这本质上仅用于简单身份验证。如果我要上传照片,评论,进行批处理请求,则这些都是不可能的。社交名流不使用Facebook的PHP SDK作为依赖项。它使用Guzzle程序包仅发出直接API请求以进行身份​​验证。

由于没有简单的SO答案以最少的步骤直接集成Facebook SDK,所以我想写这篇。

最佳答案

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

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


接下来,在外壳程序提示符下运行 composer update,将sdk拉入供应商文件夹。

现在,我们想在我们的应用程序中使用Facebook SDK作为服务提供商。但在此之前,让我们设置 app_idapp_secretdefault_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并添加以下内容:

<?php

return [
'config' => [
'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

现在,我们可以在Providers文件夹中编辑 FacebookServiceProvider.php。唯一的区别是我们需要在 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提供的 other types of bindings您可能要签出。

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

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Facebook\Facebook;

class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
}

/**
* Register any application services.
*
* @return void
*/
public function register()
{
$this->app->singleton(Facebook::class, function ($app) {
return new Facebook(config('facebook.config'));
});
}
}


就是这样现在,我们可以使用Facebook作为该应用程序的服务。现在,我们可以在我们想要在应用程序中使用它的任何地方 inject facebook对象。从这里开始,只需遵循 Facebook documentation的说明即可调用其API。”

例如,Extra Stuff:

在继续之前,我想提一下,我发现Symfony的人们撰写的系列文章对理解 Service ContainerDependency Injection的概念非常有帮助。您可以 find them here

现在,让我们尝试执行一个基本操作,例如从facebook检索一个人的名字。为了获取有关Facebook用户的信息,我们需要通过发送基本参数来调用Facebook API:用户的Facebook ID和访问令牌。我们分别称这些 uidaccess_token。您将需要使用Facebook的一种方法来检索这些:


FacebookRedirectLoginHelper-当您希望从服务器端进行Facebook身份验证时。
FacebookCanvasHelper-用于基于客户端画布的应用程序身份验证
FacebookJavaScriptHelper-用于客户端javascript身份验证


您可以按照Facebook getting started指南中提供的步骤来设置所需的身份验证类型。

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

<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<button id="btn-login" type="button" class="btn btn-primary btn-lg">
<span> Login with Facebook</span>
</button>

<script>
$(document).ready(function() {
$.ajaxSetup({ cache: true }); // since I am using jquery as well in my app
$.getScript('//connect.facebook.net/en_US/sdk.js', function () {
// initialize facebook sdk
FB.init({
appId: 'xxxxxxxxxxxxxxxx', // replace this with your id
status: true,
cookie: true,
version: 'v2.8'
});

// attach login click event handler
$("#btn-login").click(function(){
FB.login(processLoginClick, {scope:'public_profile,email,user_friends', return_scopes: true});
});
});

// function to send uid and access_token back to server
// actual permissions granted by user are also included just as an addition
function processLoginClick (response) {
var uid = response.authResponse.userID;
var access_token = response.authResponse.accessToken;
var permissions = response.authResponse.grantedScopes;
var data = { uid:uid,
access_token:access_token,
_token:'{{ csrf_token() }}', // this is important for Laravel to receive the data
permissions:permissions
};
postData("{{ url('/login') }}", data, "post");
}

// function to post any data to server
function postData(url, data, method)
{
method = method || "post";
var form = document.createElement("form");
form.setAttribute("method", method);
form.setAttribute("action", url);
for(var key in data) {
if(data.hasOwnProperty(key))
{
var hiddenField = document.createElement("input");
hiddenField.setAttribute("type", "hidden");
hiddenField.setAttribute("name", key);
hiddenField.setAttribute("value", data[key]);
form.appendChild(hiddenField);
}
}
document.body.appendChild(form);
form.submit();
}

</script>
</body>
</html>


如果您的应用具有用户所需的不同权限集,请编辑 scope字段。对于所有可用的Facebook权限 see here

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

现在回到服务器端,由于我们有 uidaccess_token,我们可以将它们存储到数据库中,然后从服务器对Facebook API进行简单调用。在 routes/web.php中设置一条路由以接收表单数据:

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


在shell上创建 FacebookUser控制器:

php artisan make:controller FacebookUser


控制器的代码如下:

<?php

namespace App\Http\Controllers;

use Request;
use App\User; // you need to define the model appropriately
use Facebook\Facebook;

class FacebookUser extends Controller
{
public function store(Facebook $fb) //method injection
{
// retrieve form input parameters
$uid = Request::input('uid');
$access_token = Request::input('access_token');
$permissions = Request::input('permissions');

// assuming we have a User model already set up for our database
// and assuming facebook_id field to exist in users table in database
$user = User::firstOrCreate(['facebook_id' => $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对象,则为 other ways of resolving it。我个人最喜欢的是使用 resolve()帮助程序,因为它可以工作,而与对象上下文或类中的静态函数无关。

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

关于laravel - 如何将Facebook PHP SDK与Laravel 5.4集成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42945596/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com