0

有没有办法用动态复合动作编写 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')
);
4

2 回答 2

1

对于你的问题,我找到了一些答案。我想这完全取决于您想如何构建 Zend 框架软件。

据我了解,您有一个名为 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() 来重新调度(我认为会发生这种情况......)

祝你好运!

于 2013-06-06T00:39:12.520 回答
0

我实际上认为标准路线类不可能做到这一点。您可以扩展路由器、扩展正则表达式路由类或使用控制器插件来操作匹配的动作名称;但如果您可以更改控制器中的操作名称以匹配 URL 中的操作,实际上会容易得多。

于 2013-06-05T17:53:00.623 回答