我是PhalconPHP的新手,我正在尝试整合Facebook php-sdk,我不知道如何制作它以便我可以在我的应用的每个页面上访问$ facebook和$ user变量(或者如果需要的话重定向)到目前为止我的引导程序文件中有以下内容:
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)从控制器访问$ user的最佳方法是什么?似乎没有效果。我最好只做一些像
这样的事情 $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 :(得分:1)
为什么不使用会话?
例如:
$di->set('session', function() {
$session = new SessionAdapter();
$session->start();
$session->set('user', array(
'fb'=> new Facebook()
));
return $session;
});
然后扩展你的视图和基本控制器,它检索fb会话并将其存储为静态变量。
答案 1 :(得分:1)
子类控制器如下:
class ControllerBase extends Controller
{
protected $user;
protected function beforeExecuteRoute($dispatcher)
{
...
$user = $facebook->getUser();
...
}
}
您可以从ControllerBase继承而不是Controller,并在任何动作函数中使用$ user。
答案 2 :(得分:0)
我不会使用会话,而是使用session bag来存储用户,因为它更灵活。
并回答你关于'发生了什么'的问题。我不是专家,但从经验来看,我认为Phalcon的DI返回对象而不是原始类型。你做得很好:
$cl = new stdClass();
$cl->hello = 'hi';
$di['hello'] = $cl;
$di->get('hello')->hello; // 'hi'
但是试图照原样做:
$di['bye'] = 'bye';
$di->get('bye');
会给你一个例外'服务'再见'无法解决'。 (如果传递数组,则'缺少'className'参数'
结论:
$user
转换为stdClass或