2010-02-12 17 views
0

我需要完成的是具有單個數據庫但具有多個用戶的多個帳戶(公司)的單個應用程序。通過URL在一個CakePHP應用程序中處理多個帳戶和用戶domain.com/account/controller/action

的URL約定必須如下:domain.com/account/controller/action

因此,所有的控制器是由該公司/帳戶名前綴。

所有帳戶將共享單個數據庫,但每個帳戶都需要能夠限制對其數據的訪問。

問題是,我該如何實現?我想過實現某種類型的htaccess重寫,其中我刪除了第一個URL參數(account),並將其作爲查詢字符串參數傳遞,這會在app_controller內部解析。然而,挑戰在於保持整個應用程序中的所有鏈接的完整性。即蛋糕路由將以某種方式需要知道帳戶參數並將其傳遞給所有輸出鏈接。

有沒有人以前做過類似的事情?

回答

0

你可以做兩件事情,包括路由。

首先,設置在線路的變量:

Router::connect('/:user/blog/*', array('controller' => 'blogs', 'action' => 'index')); 

現在你可以用$this->params['user']訪問用戶變量。與此相關的是,你將不得不手動設置你想要管理的每個控制器和動作。我認爲這沒什麼大不了的,因爲大多數情況下最好重寫CakePHP的默認路由體系結構。

其次,你可以告訴你正在等待一個變量,並且可以在你的函數中作爲參數訪問。

Router::connect('/(.*)/*', array('controller' => 'blogs', 'action' => 'index')); 

在你的控制器:

function index($a, $b){ 
    pr($a); 
    pr($b); 
} 

而現在你會得到兩個瓦爾。

我不知道它是否可以自動生成,也許重寫htaccess可能是一個好主意。

希望它有幫助。

0

這是完全可能的(但我從來沒有這樣做過)。

我假設你使用標準的CakePHP認證方案。如果是這樣,關於當前登錄用戶的信息可以在Auth-> User數組中找到。

Cake期望您在數據庫中擁有用戶表。您應該改變模型以與用戶表建立belongsTo關係(即所有表都有一個user_id字段)。

在您的模型中,您可能可以使用afterFind()掛鉤來檢查user_id字段是否與當前登錄的用戶匹配,如果不是這種情況,則返回false。在您的控制器中,您應該檢查所有模型操作是否有誤。

.htaccess的想法可能不是很好。您應該將授權儘可能靠近數據源,放在模型中的蛋糕中(您可以將afterFind回調放入AppModel類中)。

擴展您的示例:

用戶請求/ someController/someAction。

someAction: 

if($this->someModel->someOperation(someArgument)) { 

    //OK, show view 

} else { 

    // Something went wrong 
    // Your afterFind method provides a clue via the model->failure attribute 

    $this->flash($this->someModel->failure); 

} 
相關問題