0

I was following this tutorial for setting up Facebook PHP SDK 5.0 extension in my Yii 2.0 project. And it works as expected, but every time (in any of the controllers) I need to use some of the features from here this, I need to make an instance like this:

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

and later use it:

// 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}');

but I'm not sure how practical is this, to make an instance of an object in every action/controller where I need to use it. I want to add this data as a general data in the config file. So I tried something like this:

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

and later in the actions I want to take this value like:

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

and after that do all the operations mentioned above. So I want to generalize the values in the config file like all other extensions, but I keep getting the error:

Facebook\Exceptions\FacebookSDKException

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

Is it possible this to be entered in web config file, and with that, to avoid creating the object with same credentials before each Facebook call?

EDIT 1:

Reply to @machour response:

I followed your suggestion and It was still throwing the same error. Then I found it working as follows:

<?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
         ]);
    }
}

And then:

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

At some point this is acceptable solution, since the redundancy is eliminated. The keys are not only at one place.

But do you have any idea how to transfer all the keys to the config file instead of the MyFacebook class?

delux
  • 1,694
  • 10
  • 33
  • 64

1 Answers1

1

The problem is that Facebook\Facebook doesn't implement $app_id, $app_secret and $default_graph_version as public properties, so your parameters are not taken in account when Yii builds the object declared in your component.

One way to fix that is to create your own class that extends Facebook, with those public properties, and to correctly call Facebook\Facebook constructor from it's own constructor. And then point your configuration to that new class instead :

<?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
         ]);
    }

}

And then:

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

That should do the trick.

machour
  • 704
  • 1
  • 7
  • 16