0

我下面this教程設置Facebook的PHP SDK 5.0擴展在我的Yii 2.0項目。它工作正常,但每次(在任何控制器),我需要使用的一些功能從這裏this,我需要一個實例是這樣的:Facebook的PHP SDK 5.0中的Yii 2.0框架(配置文件)

$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類?

回答

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' 
    ], 

這應該做的伎倆。

+0

請參閱我的編輯1 – delux