Php 具有动态复合动作的Zend路线?

Php 具有动态复合动作的Zend路线?,php,zend-framework,zend-route,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/... -> produ

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

例如:

uri -> desired action
/company/unique-product-code/overview -> product-overview
/company/unique-product-code/gallery -> product-gallery
/company/unique-product-code/... -> product-...
当前代码(不起作用):


我认为这在标准的route类中是不可能的。您可以扩展路由器、扩展regexp路由类或使用控制器插件来操作匹配的操作名称;但实际上,如果您可以更改控制器中的操作名称以匹配URL中的操作,那么就容易多了

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

据我所知,你有一个叫公司的控制员。然后,它有各种操作,包括productOverviewAction()等

因此,这里有一些“几乎就要解决”的解决方案——然后我将解决您当前的难题:

第一个可能的答案

您可能希望使用公司控制器获取公司特定信息。也许您可以制作一个名为Product的控制器来获取产品信息。然后,您实际上需要转到类似于/product/[unique id]/overview-nice URL的内容。以下是与之匹配的路线:

$route = new Zend_Controller_Router_Route(
    'product/:productCode/:action',
    array(
        'controller'=>'product'
    )
);
正如你所看到的,它甚至不是正则表达式,所以它可以很快

第二个可能的答案

需要正则表达式的原因是,该操作与url不匹配,但它是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()作为不重新修补(我认为这种情况会发生…)


祝你好运

产品代码是否都是alpha和更低?我可以将模式更改为[a-zA-Z-]+,但这不是问题所在,这是添加到路由器的最后一条路径?大概最后一位应该是
'3'=>'action'
?@timfuntain,谢谢。我会给这个问题留出一些时间,在将其标记为已回答之前挂起并做更多的研究。我目前确实使用您的解决方案#2,这也是@timfuntain在回答这个问题之前实施的回答中提到的。然而,我之所以选择问这个问题,是因为现在我知道这个问题的解决方案是否可行+感谢您花时间和提供详细信息。谢谢!我想了想,我真的很想解决它-但我一直在想-如果不创建一个全新的路由器,它就无法工作。。。很高兴你有了有效的东西。:)
public function overviewAction()
{
    return $this->productOverviewAction();
}