2

我正在尝试在我的应用程序中使用模块中的共享控制器,但我不确定该怎么做。这是我想要做的:

  1. 我有两个 revel 应用程序,一个前端应用程序和一个后端应用程序。前端应用程序用于显示面向用户的站点,后端应用程序用于管理内容。
  2. 我根据预订示例创建了一个特殊的控制器来连接到数据库。
  3. 我希望前端和后端应用程序都使用相同的控制器,以最大限度地减少冗余。

从示例中,当您想要一个控制器数据库时,它大致转换为:

type DBController {
     *revel.Controller
}

type App {
    DBController
}

这适用于我只想拥有 1 个应用程序,但是当我想将控制器共享到另一个应用程序时,我无法导入DBController到应用程序。

我尝试过的事情

我尝试移动DBController到它自己的包,然后导入它并直接从它继承:

// in db.go
package controllers

// import and stuffs

type DBController {
    *revel.Controller
}

// in app.go
package controllers
import (
    dbc "site.com/modules/controllers"
)

type App struct {
    dbc.DBController
    // *dbc.DBController
}

这给了我一个恐慌错误,指出找不到路由:

panic: Route validation error (in /app/path/routes:7):
       revel/controller: failed to find controller App

在有和没有指针的情况下继承。

我也尝试过 Revel 的模块,使用相同的代码,但不同的目录并通过配置导入:

// app.conf
modules.dbcontroller=site.com/modules/dbcontroller

然后在app.go

type App struct {
    DBController
}

但它仍然没有像以前一样出现同样的错误。我非常相信正确的路线是使用模块,因为文档说(强调我的):

模块是可以插入应用程序的包。它们允许在多个 Revel 应用程序或第三方来源之间共享控制器、视图、资产和其他代码。

模块应该与 Revel 应用程序的布局具有相同的布局。“托管”应用程序会将其合并如下:

  1. module/app/views 中的任何模板都将添加到 Template Loader 搜索路径中
  2. module/app/controllers 中的任何控制器都将被视为在您的应用程序中

ETC..

但我不确定如何从这里共享和派生我的控制器。

TL; 博士

如何在 Revel 中共享控制器,以便我可以从其他模块继承控制器,大致如下:

import dbc "site.com/modules/dbcontroller"

type App struct {
    dbc.DBController
}

这样DBController可以与多个狂欢应用程序一起使用吗?非常感谢。

4

1 回答 1

0

我不是权威,但即使我没有完整的答案,我也会提出一些可能会有所帮助的意见。

你的问题让我印象深刻的第一件事是使用了“继承”这个术语——Go 不支持继承。它确实支持嵌入。我可能已将问题主题写为“Revel 框架中的模块中的重用控制器。

其次,我想知道您是否尝试在两个单独的 Revel 应用程序之间重用 Revel 模块,或者您是否尝试在恰好有前端和后端的一个Revel 应用程序的两个独立部分重用模块中的代码。快速阅读揭示框架让我认为模块是为前者设计的,而不是后者。

第三,我想知道您是否将文件与包混淆了。在学习 Go 时,一个包可以跨越多个文件对我来说并不明显。如果在 db.go 和 app.go 等两个文件中存在相同的“包控制器”声明,它们仍然在同一个包中。

于 2015-08-16T10:32:12.587 回答