Как получить доступ к другим контроллерам в вашем приложении?

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

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

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

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

3 ответа

Решение

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам