【问题标题】:CakePhp Routes & Session VariablesCakePhp 路由和会话变量
【发布时间】:2010-06-30 21:54:08
【问题描述】:

我不能在 routes.php 中根据会话变量的内容路由用户是否有内在原因?例如

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

可以,但是用 $_SESSION['userid'] 替换 1 不行。

我在这里遗漏了关于会话变量的重要内容吗?

在不使用会话变量的情况下将登录用户从 /dashboard 重新路由到 /controller/view/$userid 的替代建议将同样受到赞赏!

【问题讨论】:

    标签: cakephp routes session-variables


    【解决方案1】:

    解析路由时会话尚未开始。如果您使用 Cake 的会话处理,它们由 Session 组件启动,该组件仅与控制器一起加载,这发生在路由之后。

    您也不应该使路由动态化,因为它们用于反向路由:

    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 架构,如地图。它根本不是做任何“真正的工作”的地方。一切动态都发生在控制器中。

    【讨论】:

      【解决方案2】:

      如果 dash 方法应该检索并显示用户的记录,那么您可以从Auth component 中检索当前登录用户的 ID,而不是将用户 ID 作为参数。

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

      如果必须,您可以使用App::import() 加载会话组件。

      【讨论】:

      • 我认为将问题移到函数内部是明智的。我还没有太多使用 Auth 组件(也许我应该进一步调查它?)但这对我来说可能是一个快速修复:function dash($id) { if(empty($id)) $id = $_SESSION[ '用户身份']; ... } 我还是很好奇为什么 session 变量和 routes.php 不想混用...
      猜你喜欢
      • 2012-06-09
      • 2016-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多