2016-09-13 3 views
2

"news", "articles"및 "shop"과 같이 자체 컨트롤러마다 여러 컨트롤러가있는 응용 프로그램이 있습니다. 그들은 서로 연결되어 있지 않지만 현재 상점 범주와 관련된 뉴스와 같이 데이터를 삽입해야 할 필요가 있습니다. 요청을 처리하는 현재 컨트롤러가 아닌 다른 컨트롤러에 액세스 할 수있는 깨끗한 방법을 찾지 못했습니다.응용 프로그램에서 다른 컨트롤러에 액세스하는 방법은 무엇입니까?

모듈의 구조는 다음과 같습니다

  • Site.pm는 주 프로젝트 파일입니다.
  • Articles.pm 기사를 처리합니다.
  • News.pm 뉴스를 처리합니다.
  • Shop.pm 숍을 처리합니다.

Site.pm은 모듈 이름 배열에서 동적으로로드하고 register 함수를 호출하여 시작시 경로 및 기타 사항을 설정합니다. 기사, 뉴스 등은 모두 데이터베이스의 컨텐츠를 가져오고 인라인 템플릿으로 렌더링되므로 상점의 모든 항목에 해당 정보가 필요한 경우가 아니기 때문에 관련 뉴스를 가져 와서 숨겨 놓을 수는 없습니다.

답변

0

내가 Mojolicious에 근무 한 적이없는하지만 IMO이 가장 좋은 방법입니다 -

다음 클라이언트에서 렌더링 할 수있는 JSON 데이터를 반환해야합니다 어떤 다른 그것을 원하는 컨트롤러와이 컨트롤러에 GET 요청을 보내야합니다 귀하의 사이트 컨트롤러 측면. 보세요 Rendering JSON. 희망이 도움이됩니다.

+1

아니요. 건강하지 않은 것 같습니다. 사실 모든 서비스가 동일한 애플리케이션에있는 마이크로 서비스 아키텍처가 아닙니다. 당신은 작은 응용 프로그램에서 그것을하고 싶지 않아요. – simbabque

3

이것은 코드가없는 이론적 인 대답입니다.

실제 컨트롤러에서 데이터베이스 항목을 분리 한 모델 일 수 있습니다. 좋습니다.

그래서 우리가 가게에 있다고 가정하고 현재 제품과 관련된 뉴스를 보여 드리려고합니다. 적어도 두 가지 방법이 있습니다.

  1. 모델을 직접 호출하십시오. 뉴스 모델은 제품에 대한 뉴스를 얻을 수있는 방법을 제공합니다. 제품 페이지를 표시하는 상점 컨트롤러에서 그렇게합니다. 이 컨트롤러는 템플릿을 숨겨 넣을 수 있도록 템플릿에 액세스 할 수 있어야합니다.

  2. 외부에서 액세스 할 수없는 메소드를 뉴스 컨트롤러에 만듭니다. 제품 ID를 가져 와서 관련 뉴스 기사를 찾은 다음 숨겨진 정보로 채 웁니다. 상점 컨트롤러의 상품 페이지 컨트롤러에서 전달합니다. 그런 다음 제품 페이지 컨트롤러가 계속됩니다. 이것은 보다 더 디커플링 된입니다. 두 경우 모두

, 당신의 가게 템플릿은 뉴스를 표시하기위한 은닉에 물건을 처리하는 방법을 알고 다른 템플릿이 포함되어 있습니다. 여기에서 뉴스 템플릿을 재활용 할 수 있습니다.

+0

"뉴스 컨트롤러에 메소드를 작성했습니다. 앞으로 전달하십시오"- 그렇게하고 싶지만 현재와 다른 컨트롤러에 액세스하는 방법을 모르겠습니다. – ZzZombo

+0

@ZzZombo 내가 제안한 것이 Mojolicious에서 작동하지 않는 것 같습니다. 나는 MoHolicious의 저자 인 Sri와 irc.perl.org에 #mojo에서 물었습니다. 촉매제 같은 것은 없었습니다. _it는 모든 비동기식 기능과 호환되지 않습니다. _ 공유 기능을 헬퍼로 추상화하고 http : //를 제공하는 것이 좋습니다. mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Adding-a-plugin-to-your-application을 참조 지점으로 사용하십시오. – simbabque

+0

너무 나빠요. 다른 컨트롤러의 요점은 정확히 애플리케이션의 부분을 분리하는 것이지만 공유 기능을위한 헬퍼를 추가하면 전체 시스템 설계가 어려워집니다. 나는 단지'Site.pm'에 전체 프로젝트를 유지할 수도 있습니다. – ZzZombo

0

내 코드, 피 - 혈액, 그리고 내 코드에 대한 수치심을 바탕으로, 나는 조언했다. 컨트롤러의 각 메소드는 하나의 함수 만 호출하고 그 결과를 템플릿에 전달해야한다. 이것은 @simbabque의 대답과 다소 유사합니다.

이것은 컨트롤러를 테스트하고 html 템플릿을 제공하는 대신 API를 작성하고 프레임 워크를 완전히 변경하는 데 도움이됩니다 (Perl 인 한).

그래서, 컨트롤러와 모델 사이의 선택 레이어를 추가합니다 :

  1. $t->get('/books/:id')->to('books#get')
  2. sub Books::get{ my $self = shift; my $book = FBooks::get($self->param('id')); # plus template call }
  3. sub FBooks::get{ # here you call your Model }
  4. # your Model calls your DB 당신은 FBooks을 제공 :: 당신이 여러개의 c를 만들 필요가있을 때에 만 얻을 수 있습니다. 당신의 모델에 대한 모든 것/s (아마 이것은 완벽한 예가 아니지만, 당신이 나의 요점을 얻길 바랍니다). 나는 도우미 군대 대신에 이것을 선호합니다. 다른 더 좋은 방법이 있다면, 나는 그것을 배우게되어 기쁘다.

관련 문제