2011-11-24 63 views
0

不可见的ID连接问题,我想下面的SEO链接,如:CakePHP的2.0路由器::在URL

www.example.com/users/profile/webfacer 

我不想使用独特的用户从数据库中获取。

我尝试在我的AppController中使用路由器方法connect。但我意识到,这是不可能的(或者不知道它现在使用在他们还routes.php文件中使用不帮助)是这样的:

//in AppController 
Router::connect('/users/profile/:name', 
    array(
     'controller' => 'users', 
     'action'  => 'profile' 
    ) , 
    array(
     'pass' => array('id', 'name'), 
     'id' => '[0-9]+' 
    ) 
); 

我怎样才能重现此链接(以下例如)与这个网站的链接助手发送ID,但在URL中没有表现出来:

$this->Html->link('webfacer',array(
     'controller'=>'users', 
     'action'=>'profile', 
     'id'=>1, 
     'name'=>'webfacer' 
)); 

这将输出www.example.com/users/profile/username:webfacer意味着我的路由器没有出现我的路线选择。

有没有人有同样的问题,并解决了这个问题?

回答

3

因为你没有在你的路由字符串中放入:id参数,所以当你在助手中传递它时,Cake不知道该做什么,这就是为什么它只是将它作为普通参数附加到URL中。没有办法通过URL传递一个“隐藏”的ID,最好的办法是将其公开或在应用程序的另一端写入一些基于您传递的用户名获取ID的内容(确保此列已编入索引且网址安全)。

我只想简化你的路线,这一点:

//in AppController 
Router::connect('/users/profile/:name', 
    array(
     'controller' => 'users', 
     'action'  => 'profile' 
    ) , 
    array('pass' => array('name'), 
    ) 
); 

也懒得传递ID的帮手。在你的个人资料动作中,你只是有这样的事情:

public function profile($name) { 
    $user = $this->User->find('first', array('conditions' => array('name' => $name))); 
} 
+0

好吧......我想我可以处理它自我。这是我第一次找到最后的解决方案,但我认为获取(int)作为唯一用户varchar更快或不是? – webfacer

+0

我不担心在项目开发的早期优化速度。如果你真的担心这种差异,最好在数据库的'name'列中添加一个INDEX。 – brism

+0

你的权利非常感谢你! – webfacer