2010-11-11 103 views
0

我目前正在構建一個使用ZF的應用程序,並希望整合Facebook連接 - 對架構有一些疑問。Zend Framework的體系結構+ Facebook連接

功能: 所有登錄都經過FB連接,沒有其他登錄表單。當用戶首次點擊「連接」時,應用程序需要在數據庫中爲他們創建一個條目,以將額外數據綁定到(評論,個人資料等)。

如果用戶沒有登錄,頭部應該在所有頁面上都有一個「使用FB Connect登錄」按鈕,如果用戶沒有登錄,頭部應該有一個歡迎消息/圖片/配置文件完成%欄。

架構 至於我可以看到,有兩個組成部分 - 一個JS調用,處理登錄,重定向和cookie的寫作(FB:登錄按鈕)和一些PHP讀取cookie的。我有點困惑應該去哪裏。

登錄按鈕是通過JS,所以我已經加載它在我的layout.phtml並通過視圖助手處理cookie檢查 - 助手檢索cookie並將其返回給視圖。這很好,但我需要處理諸如檢查用戶是否存在以及將新用戶添加到數據庫之類的事情 - 這看起來不屬於助手中的某些內容。

我重構了它包含cookie在用戶控制器中的PHP,但我需要cookie中的視圖,這是由不同的控制器呈現。我調用了一個視圖動作助手,但這似乎更像是返回部分頁面,我無法從中獲取cookie數組變量。

我對MVC相當陌生,看起來我錯過了一些相當明顯的東西 - 想法?

代碼是正確的關閉FB開發者網站:

class Zend_View_Helper_FacebookCookie extends Zend_View_Helper_Abstract 
    { 
     public function facebookCookie() 
     { 
      $FACEBOOK_APP_ID = 'xxx'; 
      $FACEBOOK_SECRET = 'xxx'; 
      $cookie = $this->getFacebookCookie($FACEBOOK_APP_ID, $FACEBOOK_SECRET); 
      //Zend_Debug::dump($cookie); 
      return $cookie; 
     } 




     public function getFacebookCookie($app_id, $application_secret) 
     { 
      $args = array(); 
      parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args); 
      ksort($args); 
      $payload = ''; 
      foreach ($args as $key => $value) { 
       if ($key != 'sig') { 
       $payload .= $key . '=' . $value; 
       } 
      } 
      if (md5($payload . $application_secret) != $args['sig']) { 
       return null; 
      } 
      return $args; 
     } 
    } 

,並在視圖:

if ($cookie) { ?> 
    Your user ID is <?= $cookie['uid'] ?> 
<?php } else { ?> 
    <fb:login-button></fb:login-button> 
<?php } ?> 
+0

是什麼問題? – Gordon 2010-11-11 08:24:22

+0

我不知道如何構造這個,以及在哪裏放每個代碼片段 - 他們應該是助手,還是放入控制器?如何將cookie添加到視圖中以查看用戶是否已登錄? – localtalent 2010-11-11 16:28:03

回答

0

我已經在過去實現這一點的方法是通過一個單一的preDispatch插件 - 它使用Facebook API檢查用戶的狀態,然後修改其本地狀態(即登錄/未登錄)並使用Zend_Auth和/或Zend_Session存儲該狀態。

如果用戶使用Facebook進行了身份驗證但尚未存在於數據庫中,則preDispatch插件會在設置其本地狀態之前在數據庫中創建記錄。

然後,您可以查詢Zend_Auth的後面的應用程序來確定用戶是否登錄。

這樣做的好處是,如果你實現其他身份驗證機制(OpenID的或其他),你可以簡單地創建另一個插件做到這一點,你不必修改你的用戶的其餘部分最終由Zend_Auth'本地'認證)。