2013-10-14 3 views
0

Я новичок в PhalconPHP, и я пытаюсь интегрировать php-sdk в Facebook, и я не уверен, как это сделать, чтобы я мог получить доступ к переменным $ facebook и $ user на каждой странице моего приложения (или перенаправить в случае необходимости) до сих пор в моем файле начальной загрузки у меня ниже:PhalconPHP доступ к глобальным переменным в контроллерах

try { 

//Register an autoloader 
$loader = new \Phalcon\Loader(); 
$loader->registerDirs(array(
    '../app/controllers/', 
    '../app/models/', 
    '../app/facebook/' 
))->register(); 

//Create a DI 
$di = new Phalcon\DI\FactoryDefault(); 

//Setting up the view component 
$di->set('view', function(){ 
    $view = new \Phalcon\Mvc\View(); 
    $view->setViewsDir('../app/views/'); 
    return $view; 
}); 

//setup facebook 
    $config = array(); 
    $config['appId'] = 'xxxxxxxxxxxxxxxxxxxxxxx'; 
    $config['secret'] = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; 

    $facebook = new Facebook($config); 
    Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false; 
    Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2; 
    $user = null; 

    try{ 
    $user = $facebook->getUser(); 
    }catch(FacebookApiException $e){ 
    $user =null; 
    //echo "FacebookApiException :". $e; 
    } 

    $di->set('facebook', function() { 
    global $facebook; // obviously don't want this here 
    return $facebook; 
    }, true); 

    $di['user'] = $user'; 
// $di->set('user', function(){ 
// return $['facebook']->getUser(); 
// }); 
// $di['facebook']=$facebook; 
// $di['user']=$user; 

//Handle the request 
$application = new \Phalcon\Mvc\Application($di); 

echo $application->handle()->getContent(); 

} catch(\Phalcon\Exception $e) { 
echo "PhalconException: ", $e->getMessage(); 
} 

Теперь переменная facebook $ теперь доступна с помощью

$this->facebook 

на контроллер и как таковой я могу передать его в представление. Но каков наилучший способ получить доступ к $ пользователю с контроллера с помощью set ('name', $ var); похоже, недействительно. Могу ли я лучше просто делать что-то такое, как

$di->set('facebook', function(){ 
     //setup facebook config here 
    return new Facebook($config)l 
}); 

или я должен идти об этом по-другому, я должен т.е. создать компонент пользователя, который возвращает пользователю facebook?

Должен ли я следовать подходу здесь Global acssess to some component in Phalcon, который наводит на мысль, справедливо следующее

// Store it in the Di container 
    $this->di['config'] = $config; 

** редактировать

используя

$di->set('user',function() use($user){ 
return $user; 
}); 

добивается того, чего я хочу, но если я

$di->set('user', $user); 

Я не могу получить к нему доступ, может ли кто-нибудь объяснить, что происходит на самом деле?

спасибо

ответ

0

Я бы не использовал сеанс, а скорее session bag для хранения пользователя, так как он немного более гибкий.

И ответить на ваш вопрос «что происходит». Я не эксперт, но по опыту мне кажется, что DI-код Фалкона возвращает объекты, а не примитивные типы. Вы прекрасно делание:

$cl = new stdClass(); 
$cl->hello = 'hi'; 

$di['hello'] = $cl; 

$di->get('hello')->hello; // 'hi' 

но пытается сделать, как вы:

$di['bye'] = 'bye'; 

$di->get('bye'); 

даст вам исключение «Сервис„до свидания“не может быть решена».('Missing '' параметр' Classname, если вы передаете массив)

Вывод:

  • либо конвертировать $user в StdClass или
  • использовать анонимную функцию, или
  • использование сессии сумка для хранения пользовательских данных
1

Почему вы не используете сеансы?

Например:

$di->set('session', function() { 
    $session = new SessionAdapter(); 
    $session->start(); 
     $session->set('user', array(
      'fb'=> new Facebook() 
     )); 
    return $session; 
}); 

А затем продлить вид и базовый контроллер, который извлекает Fb сессию и сохраняет его в качестве статической переменной.

+0

Спасибо за подсказку, не уверен, что я хочу сохранить все это на сессиях. Я действительно не уверен, хотя это почему-то вроде $ this-> di ['config'] = $ config; не действует – TommyBs

1

Подкласс контроллер так:

class ControllerBase extends Controller 
{ 
    protected $user; 

    protected function beforeExecuteRoute($dispatcher) 
    { 
     ... 
     $user = $facebook->getUser(); 
     ... 
    } 
} 

Контроллер может наследовать от ControllerBase вместо Controller и использовать $ user в любой из функций действия.

Смежные вопросы