Я использую платформу 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] =>
)
Надеюсь, это имеет смысл.