2013-10-14 120 views
0

我是PhalconPHP的新手,我試圖將Facebook的php-sdk整合進去,而且我不知道如何讓它可以訪問$ 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)從控制器訪問$ 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

我不會使用會話,而是使用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的,或
  • 使用匿名函數,或
  • 使用會話袋存儲用戶數據
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。