Zend路由与动态复合动作?

时间:2013-06-05 16:26:58

标签: php zend-framework zend-route

有没有办法用动态复合动作编写Zend路径,这意味着一个动作结合了多个匹配模式或匹配模式与静态文本的组合?

示例:

uri -> desired action
/company/unique-product-code/overview -> product-overview
/company/unique-product-code/gallery -> product-gallery
/company/unique-product-code/... -> product-...

当前代码(不起作用):

$regexp = new Zend_Controller_Router_Route_Regex(
    '^(company)/([a-z-]+)/([a-z-]+)/?',
    array(),
    array(1 => 'controller', 2 => 'productCode', 'product-3' => 'action')
);

2 个答案:

答案 0 :(得分:1)

我找到了一些问题的答案。我想这一切都取决于你想如何构建你的Zend Framework软件。

据我了解,您有一个名为Company的控制器。然后,它有各种动作,包括productOverviewAction()等。

所以,这里有一些“差不多”的解决方案 - 然后我会解决你目前的困境。 :)

第一个可能的答案

您可能希望将控制器公司用于公司特定信息。也许你会为产品信息制作一个名为Product的控制器。然后,你真的想要去/ product / [unique-id] / overview - 漂亮的URL。这是匹配的路线:

$route = new Zend_Controller_Router_Route(
    'product/:productCode/:action',
    array(
        'controller'=>'product'
    )
);

如你所见,它甚至不是正则表达式,所以它可以很快!

第二个可能的答案

您需要正则表达式的原因是因为该操作与该URL不匹配,而是由其中的一部分组成。但是,假设您将Company :: productOverviewAction()更改为Company :: OverviewAction() - 然后您可以使用此路由:

$route = new Zend_Controller_Router_Route(
    'company/:productCode/:action',
    array(
        'controller'=>'company'
    )
);

然而,我知道这并不是你问的......

几乎完全答案

如果不对路由类进行修改,可以使用以下路由器:

$route = new Zend_Controller_Router_Route(
    'company/:productCode/:action',
    array(
        'controller'=>'company'
    )
);

然后,由于它定向到每个动作,您可以代理CompanyController中的动作。例如:

public function overviewAction()
{
    return $this->productOverviewAction();
}

*注意:我没有使用_forward()作为不重新发送(我认为会发生......)

祝你好运!

答案 1 :(得分:0)

我实际上并不认为标准路线类可以实现这一点。您可以扩展路由器,扩展regexp路由类或使用控制器插件来操作匹配的操作名称;但实际上,如果您可以更改控制器中的操作名称以匹配URL中的操作,则会更容易。