2010-06-30 67 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