0

我正在按照本教程在我的Yii 2.0 项目中设置Facebook PHP SDK 5.0扩展。它按预期工作,但每次(在任何控制器中)我都需要使用这里的一些功能this,我需要创建一个这样的实例:

$fb = new Facebook\Facebook([
  'app_id' => '{app-id}',
  'app_secret' => '{app-secret}',
  'default_graph_version' => 'v2.5',
  // . . .
  ]);

然后使用它:

// Send a GET request
$response = $fb->get('/me');

// Send a POST request
$response = $fb->post('/me/feed', ['message' => 'Foo message']);

// Send a DELETE request
$response = $fb->delete('/{node-id}');

但我不确定这是多么实用,在我需要使用它的每个动作/控制器中创建一个对象的实例。我想将此数据添加为配置文件中的通用数据。所以我尝试了这样的事情:

'components' => [
    .
    .
    'facebook' => [
            'class' => 'Facebook\Facebook',
            'app_id' => '{app-id}',
            'app_secret' => '{app-secret}',
            'default_graph_version' => 'v2.5'
    ],
    .
    .

稍后在我想采用这个值的操作中,例如:

$fb = Yii::$app->facebook;

然后进行上述所有操作。所以我想像所有其他扩展一样概括配置文件中的值,但我不断收到错误:

Facebook\Exceptions\FacebookSDKException

Required "app_id" key not supplied in config and could not find fallback environment variable "FACEBOOK_APP_ID"

是否可以将其输入到 web 配置文件中,并以此避免在每次 Facebook 调用之前使用相同的凭据创建对象?

编辑1:

回复@machour 回复:

我听从了你的建议,它仍然抛出同样的错误。然后我发现它的工作方式如下:

<?php

namespace your\namespace;

use Facebook\Facebook;

class MyFacebook extends Facebook {

    public $app_id = '{app-id}';
    public $app_secret = '{app-secret}';
    public $default_graph_version = 'v2.5';

    public function __construct()
    {
         parent::__construct([
             'app_id' => $this->app_id,
             'app_secret' => $this->app_secret,
             'default_graph_version' => $this->default_graph_version
         ]);
    }
}

接着:

'components' => [
    .
    .
    'facebook' => [
            'class' => 'your\namespace\MyFacebook'
    ]

在某些时候这是可以接受的解决方案,因为冗余被消除了。钥匙不仅在一个地方。

但是您知道如何将所有密钥传输到配置文件而不是MyFacebook类吗?

4

1 回答 1

1

问题是 Facebook\Facebook 没有将 $app_id、$app_secret 和 $default_graph_version 实现为公共属性,因此当 Yii 构建组件中声明的对象时,您的参数不会被考虑在内。

解决此问题的一种方法是使用这些公共属性创建您自己的扩展 Facebook 的类,并从其自己的构造函数中正确调用 Facebook\Facebook 构造函数。然后将您的配置指向该新类:

<?php

namespace your\namespace;

use Facebook\Facebook;

class MyFacebook extends Facebook {

    public $app_id;
    public $app_secret;
    public $default_graph_version;

    public function __construct()
    {
         parent::__construct([
             'app_id' => $this->app_id,
             'app_secret' => $this->app_secret,
             'default_graph_version' => $this->default_graph_version
         ]);
    }

}

接着:

'components' => [
    .
    .
    'facebook' => [
            'class' => 'your\namespace\MyFacebook',
            'app_id' => '{app-id}',
            'app_secret' => '{app-secret}',
            'default_graph_version' => 'v2.5'
    ],

这应该够了吧。

于 2015-10-29T12:07:47.780 回答