我需要这样做,所以任何用户都可以在我的网站上拥有一个foo.com/username,我使用Zend框架。
问题是我希望foo.com/login和其他控制器继续工作,所以我已经验证没有用户可以被命名为我将要使用的控制器之一。 htaccess无法更改或mvc配置无法正常工作。所以即时使用路由器。
我知道如果我使用类似的东西:
$routes = array();
$routes['entry'] = new Zend_Controller_Router_Route_Regex('SOME REGEX HERE',
array(
'controller' => 'profile',
'action' => 'show'
),
array(
'id' => "dsadsa", // maps first subpattern "(\d+)" to "id" parameter
1 => 'id' // maps first subpattern "(\d+)" to "id" parameter
)
);
$router->addRoutes($routes);
我可以这样做,所以匹配正则表达式的所有内容都被重定向,但我不知道是否有更好的方式(以某种方式链接2个路由器),我不必在一个非常大的OR中实际列出我的控制器。
有什么想法吗?
答案 0 :(得分:0)
您应该能够定义用户名路由(上面的正则表达式路由)并首先将其添加到路由器,然后只需添加控制器路由,例如:
$router->addRoute('user',
new Zend_Controller_Router_Route('controller/:var'));
Zend将尝试以相反的顺序将请求与定义的路由匹配。如果我的请求与您的某个控制器路由不匹配,它将尝试将其与您的正则表达式路由匹配。
答案 1 :(得分:0)
这样的事情应该有效:
$routes = array();
$routes['entry'] = new Zend_Controller_Router_Route(
':userName',
array(
'controller' => 'profile',
'action' => 'show'
)
);
然后添加所有其他路由,用于/ login,/ logout等。如Tim所述,Zend以相反的顺序匹配路由,因此它将尝试匹配您之前路由的“白名单”最后将其发送到您的“用户名”路线。
这将打破Zend确保控制器/操作存在的任何类型的错误检查,因为如果没有路由匹配,所有内容都将路由到/ profile / show。
如果您只是处理foo.com/user/<username>。
,那么所有这些都可以轻松避免。