2010-06-30 69 views
0

是否有一個內在原因,爲什麼我不能在routes.php中根據會話變量的內容路由用戶?例如CakePhp路由和會話變量

Router::connect('/dashboard', 
    array('controller'=>'users','action'=>'dash',1) 
); 

工作正常,但用$ _SESSION ['userid']取代1不行。

我在這裏丟失了關於會話變量的重要信息嗎?

如果不使用會話變量,將已登錄的用戶從/控制面板重新路由到/ controller/view/$ userid的替代建議同樣會被讚賞!

回答

3

解析路由時,會話尚未啓動。如果您使用Cake的會話處理,它們由會話組件啓動,會話組件僅在路由後發生,並與控制器一起加載。

你不應該做動態路由兩種,因爲他們是用於反向路由:如預期再

Router::connect('/dashboard', array('controller'=>'users', 'action'=>'dash')); 
$html->link('…', array('controller'=>'users', 'action'=>'dash')); 
// -> /dashboard 

如果你想使這個充滿活力的,這是行不通的:

Router::connect('/dashboard', 
    array('controller'=>'users', 'action'=>'dash', $_SESSION['user'])); 

$html->link('…', array('controller'=>'users', 'action'=>'dash', 1)); 
// -> /dashboard 

$html->link('…', array('controller'=>'users', 'action'=>'dash', 2)); 
// -> /users/dash/2 

路線應該是一個靜態的事情。路線定義您的應用程序URL架構,如地圖。這根本不是做任何「真正的工作」的地方。一切動態都在控制器中發生。

1

如果破折號方法應該檢索並顯示用戶的記錄,則不要將用戶ID作爲參數,而是可以從Auth component中檢索當前登錄用戶的ID。

function dash() { 
    $user_id = $this->Auth->user('id'); 
    // ... 
} 

如果必須,您可以加載會話組件爲App::import()

+0

我認爲你明智地在功能內移動問題。我還沒有使用Auth組件很多(也許我應該進一步調查?),但這可能是我的一個快速修復: 功能破折號($ id){ if(empty($ id))$ id = $ _SESSION [ '用戶ID']; ... } 我仍然好奇爲什麼會話變量和routes.php不想混合... – thesunneversets 2010-06-30 22:31:46