Cakephp: переменные данные в appController не согласованы в дочернем элементе Xcontroller - PullRequest
0 голосов
/ 16 февраля 2012

Я использую платформу Cakephp (2.X).

Я создал приложение для холста на Facebook.У меня есть мой объект facebook в качестве переменной в appController.Я создаю это в конструкторе.В моем userController я пытаюсь использовать этот объект.Объект есть, хотя не все данные в объекте facebook являются постоянными.

Например, если я изменяю дамп объекта facebook в appController, все свойства присутствуют.Когда я сбрасываю объект facebook в моем другом контроллере, некоторые свойства равны нулю / 0 / отсутствуют.Например, 'user', 'signatureRequest' и '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', 'signatureRequest' и 'accessToken'.

Я даже пытался реализовать функцию в appController и вызывать ее из UsersController

function getFB() {
    return $this->facebook;
}

Но я получаю ту же проблему.

Есть ли что-то очевидное, что я здесь не так делаю?

О, и это мой первый вопрос, и я новичок в CakePHP и PHP, поэтому, пожалуйста, будьте осторожны со мной.

Если вам нужна другая информация, пожалуйста, дайте мне знать.Я искал похожие вопросы, но не нашел подходящих ... извините, если это повторение.

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

Это то, что я сделал, чтобы заставить его работать так, как я хотел.И причины, по которым я это сделал. Кто-то может подтвердить, нарушает ли это какие-либо шаблоны или это приемлемо. MVC

Я конвертировал объект facebook в appController в статический член.Затем я обновляю его в конструкторе, проверив, не было ли оно уже новым.Если это уже было новым, я бы ничего не делал.как только я сделал это изменение, он сделал объект facebook в UsersController.

    <               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-> 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 голосов
/ 16 февраля 2012

Попробуйте это:

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

Метод get beforeFilter вызывается перед любым действием.

Убедитесь, что ваши классы facebook находятся в / App / Vendor / facebookпапка.

Экземпляр Facebook теперь должен быть доступен через $ this-> facebook на любом контроллере.Если вы используете метод beforeFilter в другом контроллере, обязательно вызовите

parent::beforeFilter();

Также ваш пользовательский контроллер должен выглядеть так:

class UsersController extends AppController {
    public $name = 'Users';

    public function index() {
        $uid = $this->facebook->getUser();
    }
}

удачи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...