我正在使用Cakephp(2.X)框架。
我创建了一个Facebook画布应用程序。我将我的facebook对象作为appController中的变量。我在构造函数中实例化它。在我的usersController中,我试图使用这个对象。该对象在那里,但并非facebook对象中的所有数据都是持久的。
例如,如果我在appController中转储facebook对象,则所有属性都存在。当我将facebook对象转储到我的其他控制器中时,某些属性为null / 0 /不存在。例如'user','signedRequest'和'accessToken'。
目前这就是我的文件:
appController.php
class AppController extends AppController {
public $facebook;
//other vars here
function __construct($request = null, $response = null) {
parent::__construct($request, $response);
App::import('Vendor','fb/src/facebook');
...
$this->facebook = new Facebook(//array with appId and Secret);
// doing stuff here with $this->facebook
}
//other methods
并且facebook对象在此类的每个方法中都已完全定义
UsersController.php
class UsersController extends Controller {
//some functions
function useParentsFBvar(){
//I have tried
$this->facebook;
//and I have tried
parent::facebook;
}
以上两者都没有完全定义facebook对象。特别是'user','signedRequest'和'accessToken'。
我甚至尝试在appController中实现一个函数并从我的UsersController调用
function getFB() {
return $this->facebook;
}
但我也遇到同样的问题。
有什么明显的事我在这里做错了吗?
哦,这是我的第一个问题,我是cakephp和PHP的新手,所以请对我很轻松。
如果您需要任何其他信息,请告诉我们。我搜索了类似的问题,但没有找到任何合适的...抱歉,如果这是重复。
我所做的是将appController中的facebook对象转换为静态成员。然后我在检查它是否已经被新建之后在构造函数中新建它。如果它已经是新的我什么都不做。一旦我做了这个改变,它就在UsersController中创建了facebook对象。
< appController.php >
App::uses('Controller', 'Controller');
App::import('Vendor','fb/src/facebook');
class AppController extends Controller {
public static $facebook = null;
//other members, components and helpers
function __construct($request = null, $response = null){
parent::__construct($request,$response);
//load the configurations for app
if(!static::$facebook){
static::$facebook = new Facebook(
array('appId' => $this->app_id,
'secret' => $this->secret,
'cookie'=> true));
}
}
function beforeFilter() {
//get the user and do some things with static::facebook
}
然后在UserController.php $ this-&gt; facebook给了我一个有效的对象。一旦我开始工作,我认为将逻辑移动到用户模型中是有意义的,所以我创建了一个模型函数来使用应用程序返回X个朋友。
<---------------UsersController.php------------------>
class UsersController extends AppController {
public $name = 'Users';
public function friends($count = 5) {
$this->set('friends', $this->User->getFriendsUsingApp($this->facebook, $count));
}
}
并在
<-------------------User.php--------------------------->
class User extends AppModel {
public function getFriendsUsingApp($facebook, $max = 5) {
$installedFriends = array();
try {
$installedFriends = $facebook->api('/me/friends?fields=installed');
} catch (FacebookApiException $e) {
$this->log($e->getMessage());
}
//search through the array of all returned friends and search for "ionstalled" field
$friends = array();
foreach ($installedFriends['data'] as $friend) {
if (array_key_exists('installed',$friend) && $friend['installed']) {
$friends[] = $friend;
}
}
return $friends;
}
}
这一直很好用,我觉得通过将更多的逻辑移入模型(虽然不确定),MVC会遵守,请告诉我,如果我是正确的。
我认为问题在于,首次构建appController时,它会创建一个新的facebook对象(包含所有有效数据[accessToken和user])。然后,当我的userController实例被构造时,构造了一个新的appController,从而创建了另一个新的facebook对象。不知怎的,当第二次调用新的Facebook(...)被调用时,它返回了某种类型的仅部分有效的对象(appId和secret现在是每个数组,并且没有accessToken或User。所以我让facebook静态,现在所有控制器共享facebook对象的相同副本。
<-----facebook object dumped in AppController--------->
(
[appId:protected] => //appId//
[appSecret:protected] => //secret//
[user:protected] => //an actual userID//
[signedRequest:protected] =>
[state:protected] => //state//
[accessToken:protected] => //an actual accessToken//
[fileUploadSupport:protected] =>
)
<-----facebook object on dump in UsersController--------->
(
[appId:protected] => array(
[0] => //appId//
[1] => //appId//
)
[appSecret:protected] => array(
[0] => //secret//
[1] => //secret//
)
[user:protected] => array|array
[signedRequest:protected] =>
[state:protected] => //state//
[accessToken:protected] => array|array -//though sometimes just blank
[fileUploadSupport:protected] =>
)
希望这是有道理的。
答案 0 :(得分:0)
试试这个:
App::uses('Controller', 'Controller');
// facebook
App::import('Vendor', 'facebook/facebook');
class AppController extends Controller {
public $facebook;
public function beforeFilter() {
$o = array('appId' => '__APP_ID__', 'secret' => '__APP_SECRET__');
$this->facebook = new Facebook($o);
// Do stuff with facebook instance here
// $uid = $this->facebook->getUser();
// To make instance available in view files
$this->set('facebook', $this->facebook);
}
}
在执行任何操作之前调用beforeFilter方法。
确保您的Facebook课程位于/ App / Vendor / facebook文件夹中。
Facebook实例现在应该可以通过任何控制器中的$ this-&gt; facebook访问。 如果在另一个控制器中使用beforeFilter方法,请确保调用
parent::beforeFilter();
此外,您的用户控制器应如下所示:
class UsersController extends AppController {
public $name = 'Users';
public function index() {
$uid = $this->facebook->getUser();
}
}
祝你好运