Наследовать контроллер от модуля в Revel Framework

Я пытаюсь использовать общий контроллер из модуля в своем приложении, но я не совсем уверен, как это сделать. Вот что я хочу сделать:

  1. У меня есть два приложения Revel, внешнее и внутреннее приложение. Фронтенд-приложение используется для отображения сайта, ориентированного на пользователя, а бэкэнд-приложение предназначено для администрирования.
  2. Я создал специальный контроллер для подключения к базе данных в соответствии с примером бронирования.
  3. Я хочу, чтобы внешнее и внутреннее приложение использовали один и тот же контроллер, чтобы свести к минимуму избыточность.

Из примера, когда вы хотите иметь одну базу данных контроллера, это примерно означает следующее:

type DBController {
     *revel.Controller
}

type App {
    DBController
}

Это работает, когда я хочу иметь только одно приложение, но когда я хочу поделиться контроллером с другим приложением, я не могу импортировать 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. Любые шаблоны в модулях/приложениях/представлениях будут добавлены в путь поиска загрузчика шаблонов.
  2. Все контроллеры в модуле/приложении/контроллерах будут обрабатываться так же, как если бы они были в вашем приложении.

и т.д..

Но я не уверен, как я могу поделиться и получить свой контроллер отсюда.

TL; DR

Как мне поделиться контроллером в Revel, чтобы я мог наследовать контроллер от другого модуля, примерно так:

import dbc "site.com/modules/dbcontroller"

type App struct {
    dbc.DBController
}

чтобы DBController можно было использовать с несколькими приложениями Revel? Большое тебе спасибо.


person bertzzie    schedule 16.08.2015    source источник
comment
@bertzziz, ты нашел решение? Я пытаюсь сделать то же самое.   -  person freemanpolys    schedule 17.05.2019


Ответы (1)


Я не авторитет, но сделаю несколько замечаний, которые могут помочь, даже если у меня нет для вас полного ответа.

Первое, что меня поразило в вашем вопросе, это использование термина «наследовать» — Go не поддерживает наследование. Он поддерживает встраивание. Я мог бы написать тему вопроса как «Повторное использование контроллера из модуля в среде Revel.

Во-вторых, интересно, пытаетесь ли вы повторно использовать модуль Revel между двумя отдельными приложениями Revel или пытаетесь повторно использовать код из модуля в двух отдельных частях одного приложения Revel, в котором случайно передний конец и задний конец. Быстрое прочтение структуры раскрытия заставляет меня думать, что модули были разработаны для первого, а не для второго.

В-третьих, мне интересно, возможно, вы путаете файлы с пакетами. Когда я изучал Go, для меня не было очевидным, что один пакет может охватывать несколько файлов. Если одно и то же объявление «контроллера пакетов» существует в двух файлах, таких как db.go и app.go, они все еще находятся в одном пакете.

person golliher    schedule 16.08.2015