如何在Zend中创建foo.com/user?

时间:2008-12-19 17:54:38

标签: zend-framework

我需要这样做,所以任何用户都可以在我的网站上拥有一个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中实际列出我的控制器。

有什么想法吗?

2 个答案:

答案 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>。

,那么所有这些都可以轻松避免。