Cakephp:appController中的变量数据在Xcontroller子节点中不一致

时间:2012-02-16 14:00:25

标签: php facebook cakephp inheritance controller

我正在使用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的新手,所以请对我很轻松。

如果您需要任何其他信息,请告诉我们。我搜索了类似的问题,但没有找到任何合适的...抱歉,如果这是重复。

------------------------ EDIT ---------------------- ----

这就是我为了让它按照我想要的方式工作所做的。我做事情的原因有人可以确认这是否会破坏任何模式或者这是否可以接受MVC

我所做的是将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] => 
)

希望这是有道理的。

1 个答案:

答案 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();
    }
}
祝你好运