【问题标题】:Zend 2 - Adding a custom route in one module that affects all other modulesZend 2 - 在一个模块中添加一个影响所有其他模块的自定义路由
【发布时间】:2013-10-16 23:06:02
【问题描述】:

我有一个使用大量模块的大型 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]]

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

任何人都有解决方案吗?

谢谢!

【问题讨论】:

标签: module zend-framework2 routes


【解决方案1】:

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

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

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

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

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

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

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

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

就是这样!

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 2016-07-29
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    相关资源
    最近更新 更多