0

我有一个使用很多模块的大型 ZF2 项目。

我们需要找到一种方法来自动为所有模块中的每个现有路由预置一个可选自定义路由,只使用一个模块中的代码。

它需要与 Url 视图助手一起使用。

在每个模块中,我都有默认路由,基本上是:/ModuleName[/:controller[/:action]]

但是我的新模块(公司)需要为每条路线添加公司上下文,如下所示:[/company/:company_id] /ModuleName[/:controller[/:action]]

您可能已经理解,/company/id 部分是可选的,我需要一个默认的 company_id。

我不想在每个模块的配置文件中添加这条路线。

我尝试在 Company 模块的配置文件中添加一个路由,但我很快明白我们不能在路由定义中定义 MODULE 参数,因为 Zend2 使用命名空间。

此外,我们需要对 langs 做同样的事情。

最后,我们将需要这样的东西:

[/:lang][/company/:company_id]/ModuleName[/:controller[/:action]]

无需更改任何其他现有模块中的当前配置文件。

任何人都有解决方案?

谢谢你 !

4

1 回答 1

0

我已经解决了我的问题,如果有人需要,我会在这里分享。

我只会解释这个大想法而不发布任何代码行,因为它在很大程度上取决于您构建项目的方式,而且最好以您自己的方式实现它以更好地理解它,因为如果您复制粘贴它而不试图理解它会破坏你的整个项目。也就是说,如果您无法理解此解释,则无论如何都无法实现。

首先,我有一个 BaseModule,每个模块类都从它扩展,这个 BaseModule 自动实现 getConfig() 方法本身,它是最终的,所以没有模块可以覆盖它。如果您的项目不是这样构建的,它将无法工作,您可以在这里停下来。

在这个 BaseModule 中,我有一个名为 prependRouteSegment() 的 STATIC 方法,它基本上将 key=>array 添加到 PRIVATE STATIC 数组变量中。就我而言,关键是路由,数组是该路由的默认参数。

然后,在 getConfig() 方法中,在获取配置文件并将其作为配置数组返回之前,我可以编辑任何我想要的东西。所以基本上我编辑所有现有的“分段”路由并将我的路由从静态变量和原始变量连接起来,然后添加我的默认参数。

但是还有一件非常重要的事情,您需要在 zend 执行每个模块的 getConfig() 方法之前从每个模块实际设置自定义路由。

为此,首先创建一个可以在任何模块中覆盖的 STATIC 方法 initCustomRouting(),然后,假设我的第一个加载模块是 Application,只需在 Application 模块的 __construct() 方法中解析模块列表并调用此 initCustomRouting () 静态地在每个模块上。

然后,如果某个模块需要为任何现有路由添加自定义路由,您只需在此模块中实现 initCustomRouting() 方法,并在其中使用自定义路由和默认参数调用 prependRouteSegment() 静态方法。

而已 !

不要忘记您不能在文字路由中使用参数,并且您可能不想在主机名路由上添加一些东西,所以在我的情况下,我只将路由添加到每个“分段”路由,我只是在循环时比较类型.

希望这会对某人有所帮助!

于 2013-10-18T22:40:31.723 回答