2012-03-06 26 views
1

我的情况是这样的: 我正在使用的应用程序使用子域来检测客户端是谁。 ie:client1.site.com,client2.site.com 这一切都工作正常(我没有使用任何特殊路线)。如何设置Zend Route以在MVC参数之前使用额外的“参数”?

现在,我需要将我的代码放入'测试'环境。不过,在这种情况下,我仅限于一个子域。 即:static.testsite.com

我的想法是使用Zend的路由到一个程度,这样我可以请求转换如下: static.testsite.com/client1/...static.testsite.com/client2/...

因此,第一个“参数”需要是客户机名称,随后由MVC标准参数(模块/控制器/动作)。

我打算将此路由逻辑添加到仅在测试环境中可用的Controller插件的routeStartup挂钩。

首先,有没有一种更简单的方法来完成这个我从未想到的工作?其次,如果没有,有没有人有这种需求的经验?

我正在尝试Zend提供的不同路由,但到目前为止,我一直不成功(客户端名称不断变为控制器等)。

任何帮助,非常感谢。 谢谢。

编辑:我试图通过操纵请求对象的请求uri以丑陋的方式做到这一点。但是,这会使网站的其他部分在他们的URL中没有/ clientX /部分,从而导致更多问题。使用/ clientX /部分更新所有位置也不可行。所以,尽管我可以检索客户端,但网站的其他部分仍然无法使用,这使我认为Route是唯一的方法。

编辑#2:我得到它使用下面的代码;然而

// within a Controller Plugin at routeStartup 

    $oFrontController = Zend_Controller_Front::getInstance(); 
    $oRouter = $oFrontController->getRouter(); 

    $oNewDefaultRoute = new Zend_Controller_Router_Route(
      ':testClient/:controller/:action/*', 
      array(
       'module' => 'default', 
       'controller' => 'index', 
       'action' => 'index', 
       'testClient' => null, 
      ) 
     ); 

    $oRouter->addRoute('default', $oNewDefaultRoute); 

的问题依然存在,因为它不影响任何现有的URL。所以试图访问它们中的任何一个会导致没有testClient的地方因此导致错误。我相信在初始的“客户”分配之后需要采用一些基于会话的解决方案。

但是,如果有人知道更优雅的方式来做到这一点,请让我知道。谢谢。

+0

为什么不使用client1test.testsite.com?实际上,它是一个独立的客户端,但它允许你有一个完全独立的测试与生产环境 – Ashley 2012-03-06 10:56:23

+0

这将是理想的,因为它不会真的需要任何这些变化。不幸的是,问题在于这些是实际的域/子域,因此我无法为测试环境中的每个客户端创建子域。如上所述“我仅限于一个子域名”。 – 2012-03-06 11:03:07

+0

URL中的'/ clientX'部分是否_always_?你有没有这个部分被省略的情况,第一个参数是模块还是控制器? – bububaba 2012-03-06 11:05:59

回答

1

基于INI文件的解决方案建议,未经检验的 - 只为总体思路:通过$request->getParam('client')client访问

routes.withClient.route = ":client/:module/:controller/:action/*" 
routes.withClient.defaults.module = "default" 
routes.withClient.defaults.controller = "index" 
routes.withClient.defaults.action = "index" 

价值。

+0

谢谢bububaba。我没有测试这个,因为我在Controller插件中使用它。但是,我改写了现有的默认路线,而不是新路线。我将其标记为答案,因为似乎没有任何其他路线与我想要的完全相同。谢谢你的帮助。 – 2012-03-07 04:44:32