PlayFramework. Dostęp do klas między modułami

PlayFramework. Dostęp do klas między modułami
M8
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:7
0

Witam.
Tworzę apllikację w PlayFramework. Tworzę ją na bazie kilku modułów:
/modules/common
/modules/shopping
/modules/admin

Główny moduł nie ma żadnego kodu.

Wszystko działa ok, do momentu kiedy chcę wywołać klasę pomiędzy modułami. np:
Z widoku /modules/common/app/views wywołuje klasę /modules/shopping/app/controllers/Index.java

Kopiuj
			<a href="@controllers.shopping.routes.Index.index">

Dostaje błąd:
object shopping is not a member of package controllers

W jaki sposób mogę w play wywoływać klasy z podmodułów?

mój główny build.sbt

Kopiuj
import play.Project._
import sbt._
import Keys._
name := "svp"

playJavaSettings

version := "2.0.0_(20140725)"

libraryDependencies ++= Seq(
  javaJdbc, 
  javaJpa, 
  "org.hibernate" % "hibernate-entitymanager" % "3.6.9.Final",
  "mysql" % "mysql-connector-java" % "5.1.27",
  "org.mindrot" % "jbcrypt" % "0.3m",
  cache
  )

  lazy val common = project.in(file("modules/common"))
  lazy val cirs = project.in(file("modules/cirs"))
  lazy val shopping = project.in(file("modules/shopping"))
  lazy val admin = project.in(file("modules/admin"))


val main = project.in(file("."))
  .dependsOn(common).aggregate(common)
  .dependsOn(cirs).aggregate(cirs)
  .dependsOn(shopping).aggregate(shopping)
  .dependsOn(admin).aggregate(admin)

Pozostałe pliki build dla poszczególnych modułów:
/modules/shopping/build.sbt:

Kopiuj
name := "shopping"

playJavaSettings

Common.settings

libraryDependencies ++= Seq(
  javaJdbc, 
  javaJpa, 
  "org.hibernate" % "hibernate-entitymanager" % "3.6.9.Final",
  "mysql" % "mysql-connector-java" % "5.1.27",
  "org.mindrot" % "jbcrypt" % "0.3m",
  cache
  )

/modules/common/build.sbt:

Kopiuj
name := "common"

playJavaSettings

Common.settings

libraryDependencies ++= Seq(
  javaJdbc, 
  javaJpa, 
  "org.hibernate" % "hibernate-entitymanager" % "3.6.9.Final",
  "mysql" % "mysql-connector-java" % "5.1.27",
  "org.mindrot" % "jbcrypt" % "0.3m",
  cache
  )

Podczas edycji widoku eclipse mi podpowiada pozostałe moduły (w załączniku print screen)

OPIS ZALEŻNOŚCI MIĘDZY MODUŁAMI
Moduł common: ma służyć jako zbiór elementów, klas, obiektów wspólnych dla pozostałych modułów/ aplikacji
Przykładowe klasy (MVC): użytkownicy, klienci, uprawnienia, role,

Pozostałe moduły mają być dedykowane konkretnej funkcji/aplikacji, np. Stworzę moduły (pod aplikacje) do:

  • zarządzania treścią strony (CMS),
  • przeprowadzania sprzedaży (Sklep),
  • zarządzania relacjami z klientem (CRM)
  • zarządzania wszystkimi aplikacjami (kontami użytkowników, rolami, uprawnieniami, etc.)

Wszystkie te pod moduły będą korzystały z modułu common.

Po zalogowaniu się użytkownik zobaczy stronę wyboru aplikacji/ modułu (zgodnie z uprawnienaimi).
Będą tam linki do tych aplikacji, np:

Kopiuj
			<a href="@controllers.shopping.routes.Index.index">Sklep</a>
			<a href="@controllers.crm.routes.Index.index">CRM</a>
			<a href="@controllers.cms.routes.Index.index">Zarządzanie stronami</a>
			<a href="@controllers.admin.routes.Index.index">Panel administracyjny</a>

Aby je utworzyć moduł common musi mieć dostęp (dependsOn()) do pozostałych modułów, ponieważ kontrolery odwrotnego routingu są w konkretnych modułach!!!

Jeżeli użytkownik znajdzie się już w wybranym module/aplikacji zobaczy np: panel ze swoimi danymi (imię, nazwisko, grupa, rola, etc), które będą pobierana z modułu common z klas typu: User.java, Role.java etc.

  • pf.png (211 KB) - ściągnięć: 161
edytowany 5x, ostatnio: masterdany88
SZ
  • Rejestracja:około 11 lat
  • Ostatnio:ponad 4 lata
  • Postów:616
M8
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:7
0

Wszystko robię zgodnie z tym tutorialem.
Problem leży w tym, że sbt podczas budowania nie widzi klas z pozostałych modułów.
Gdybym zastąpił tą ścieżkę na ścieżkę należącą do tego samego modułu/pakietu, np:

Kopiuj
<a href="@controllers.common.routes.Index.index">

Wszystko jest ok.

Pytanie moje brzmi: W jaki sposób mogę się odwoływać do klas z pozostałych modułów?

edytowany 1x, ostatnio: masterdany88
n0name_l
Wrzuc caly projekt.
M8
n0name_l
Gdziekolwiek, w tara na forum, na gh, obojetnie.
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:44 minuty
1

Żeby z modułu commons dostać się do klas z modułu shopping, to moduł commons musiałby mieć dependsOn(shopping). Ale to jest wbrew logice - zwykle to commons jest modułem od którego się zależy, a nie odwrotnie.

Zresztą pod tym linkiem co Szczery podał jest sekcja "Splitting your web application into several parts" gdzie jest pokazane jak się to dependsOn ustawia.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
edytowany 1x, ostatnio: Wibowit
M8
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:7
0

Ok. Przemyślałem jeszcze raz projekt. I udało mi się ustawić aby common widział klasy pozostałych pakietów

Kopiuj
lazy val cirs = project.in(file("modules/cirs"))
  	
  lazy val shopping = project.in(file("modules/shopping"))
  	
  lazy val admin = project.in(file("modules/admin"))

  lazy val common = project.in(file("modules/common"))
  .dependsOn(cirs).aggregate(cirs)
  .dependsOn(shopping).aggregate(shopping)
  .dependsOn(admin).aggregate(admin)

val main = project.in(file("."))
  .dependsOn(common).aggregate(common)
  .dependsOn(cirs).aggregate(cirs)
  .dependsOn(shopping).aggregate(shopping)
  .dependsOn(admin).aggregate(admin)

Tylko jak teraz ustawić aby pozostałe pakiety miały dostęp do common?

edytowany 2x, ostatnio: masterdany88
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:44 minuty
0

Chcesz mieć cykliczne zależności między modułami? Tak się nie da. Poczytaj o inżynierii oprogramowania, jakieś podstawy chociaż, bo popełniasz szkolne błędy.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
M8
Ja rozumiem, że cyklicznie się nie da. Problem jest w tym, że moja aktualna konfiguracja tego wymaga. Z aktualizowałem pytanie. Dodałem tam informację jakie potrzebuję relację między modułami i dlaczego.
Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:44 minuty
0

Użyj jakiejś formy wstrzykiwania zależności. Na przykład: utwórz moduł, który zależy od wszystkich innych i zawiera widok z linkami do tych widoków, które potrzebuje, a następnie wstrzyknij ten widok w reszcie aplikacji.

Widok w Playu sprowadza się do klasy generującej obiekt typu Html, który to obiekt można podawać jako parametr do kolejnych widoków i bezpośrednio w nich wklejać zawartość przekazanego wyrenderowanego widoku.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
M8
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 10 lat
  • Postów:7
0

Adresy na tym widoku zrobię ręcznie (localhost/shop).
Natomiast resztę modułów ustawię zależne od common ".dependsOn(common)", mam nadzieję, że więcej nie będę potrzebować dostępu z common do pozostałych modułów :D.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.