0

我是 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);

我无法访问它,谁能解释一下到底发生了什么?

谢谢

4

3 回答 3

1

为什么不使用会话?

例如:

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

然后扩展您的视图和基本控制器,该控制器检索 fb 会话并将其存储为静态变量。

于 2013-10-15T16:01:37.997 回答
1

子类控制器像这样:

class ControllerBase extends Controller
{
    protected $user;

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

您的控制器可以从 ControllerBase 而不是 Controller 继承,并在任何操作函数中使用 $user。

于 2013-12-23T02:29:59.803 回答
0

我不会使用会话,而是使用会话包来存储用户,因为它更灵活一些。

并回答您关于“发生了什么”的问题。我不是专家,但根据经验,我认为 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,要么
  • 使用匿名函数,或
  • 使用会话包存储用户数据
于 2013-11-28T00:05:16.507 回答