2016-09-13 3 views
2

У меня есть приложение с несколькими контроллерами, посвященными каждой своей части, скажем, «новости», «статьи» и «магазин». Они не связаны друг с другом, но они должны быть, поскольку мне нужно вставлять данные из них, например, новости, относящиеся к текущей категории магазинов. Я не нашел чистого способа доступа к контроллерам, отличным от текущего, обрабатывающего запрос.Как получить доступ к другим контроллерам в вашем приложении?

Структура модулей:

  • Site.pm главный файл проекта.
  • Articles.pm ручные изделия.
  • News.pm ручные новости.
  • Shop.pm ручки магазин.

Site.pm нагрузки каждый из вышеперечисленных динамически из массива имен модулей и вызывает его register функцию, чтобы установить маршруты вверх и другие вещи при запуске. Статьи, новости и т. Д. Все берут контент из базы данных и отображаются как встроенный шаблон, поэтому я не могу просто получать связанные новости и вставлять их в кошелек, так как не все записи в магазине могут даже нуждаться в этой информации.

ответ

0

Я не работал на Mojolicious но ИМО это лучший подход -

Ваш контроллер сайта должен посылать запросы GET с любыми другими контроллерами, хочет и эти контроллеры должны возвращать данные в формате JSON, который затем может быть вынесено на клиенте боковая сторона. Посмотрите Rendering JSON. Надеюсь, это поможет.

+1

Нет. Это звучит не здорово. На самом деле это своего рода не такая архитектура микросервиса, где все службы находятся в одном приложении. Вы не хотите делать это на маленьком приложении. – simbabque

3

Это теоретический ответ без кода.

У вас, вероятно, есть базы данных, отделенные от реальных контроллеров в качестве моделей. Это хорошо.

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

  1. Вы называете свои модели напрямую. Ваша модель новостей дает возможность получать новости для продукта. Вы делаете это в контроллере магазина, который отображает страницу продукта. Этот контроллер должен помещать материал в stash, чтобы шаблоны могли получить к нему доступ.

  2. Вы создаете метод в своем контроллере новостей, который недоступен снаружи. Вы заставляете его брать идентификатор продукта и находить соответствующие статьи новостей и заполнять их в кошельке. Вы переходите к нему с вашего контроллера страницы продукта в контроллере магазина. После этого контроллер страницы продукта продолжается. Это более развязанный путь.

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

+0

«Вы создаете метод в своем контроллере новостей ... вы переходите к нему» - так я и хочу, но я не знаю, КАК ДОБРАТЬСЯ с другим контроллером от текущего. – ZzZombo

+0

@ZzZombo Кажется, что я предложил не работать в Mojolicious. Я спросил в #mojo на irc.perl.org и Шри, автор Mojolicious сказал, что нет никакого продвижения, как в catal_, _it несовместим со всеми асинхронными функциями, мы рекомендуем вам абстрагировать общие функции в helpers_ и предоставлять http: // mojolicious.org/perldoc/Mojolicious/Guides/Cookbook#Adding-a-plugin-to-your-application как контрольная точка. – simbabque

+0

Это слишком плохо. Точка разных контроллеров состоит в том, чтобы разделить части приложения, но добавление помощников для общих функций поражает весь дизайн системы. Я мог бы также сохранить весь проект только на 'Site.pm'. – ZzZombo

0

Основываясь на моем опыте, кодировании крови и большом стыде за мой код, советую: каждый метод в контроллере должен вызывать только одну функцию и передавать результаты в шаблон. Это как-то похоже на ответ @simbabque.

Это поможет вам позже протестировать контроллер, написав API вместо предоставления html-шаблонов, даже полностью изменив структуру (до тех пор, пока это 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 alls к вашей модели/s (может быть, это не прекрасный пример, но я надеюсь, что вы поймете мою мысль). Я предпочитаю это вместо армии помощников. Если есть другой лучший способ, я с удовольствием узнаю его.

 Смежные вопросы

  • Нет связанных вопросов^_^