0

好吧,我需要这样做,以便任何用户都可以在我使用 Zend 框架的站点中拥有 foo.com/username。

问题是我希望 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 中实际列出我的控制器。

任何的想法?

4

2 回答 2

0

您应该能够定义您的用户名路由(您上面的正则表达式路由)并首先将其添加到路由器,然后只需添加您的控制器路由,例如:

$router->addRoute('user', new Zend_Controller_Router_Route('controller/:var'));

Zend 将尝试以相反的顺序将请求与定义的路由匹配。如果我的请求与您的控制器路由之一不匹配,它将尝试将其与您的正则表达式路由匹配。

于 2008-12-19T18:27:40.523 回答
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>,那么所有这些都可以轻松避免。

于 2008-12-21T07:05:55.420 回答