Как получить доступ к другим контроллерам в вашем приложении?
У меня есть приложение с несколькими контроллерами, каждый из которых посвящен своей части, например, "новости", "статьи" и "магазин". Они не связаны друг с другом, но они должны быть, так как мне нужно вставить данные из них, например, новости, связанные с текущей категорией магазина. Я не нашел чистый способ доступа к контроллерам, кроме текущего, который обрабатывает запрос.
Структура модулей:
Site.pm
основной файл проектаArticles.pm
обрабатывает статьи.News.pm
обрабатывает новости.Shop.pm
ручки магазина.
Site.pm
загружает каждое из вышеперечисленных динамически из массива имен модулей и вызывает его register
функция для настройки маршрутов и других вещей при запуске. Статьи, новости и т. Д. Все берут контент из базы данных, и он отображается как встроенный шаблон, поэтому я не могу просто взять связанные новости и забросить их в тайник, поскольку не все записи в магазине могут даже нуждаться в этой информации.
3 ответа
Это теоретический ответ без кода.
Возможно, у вас есть база данных, отделенная от реальных контроллеров в качестве моделей. Это хорошо.
Итак, давайте предположим, что мы находимся в магазине, и мы хотим показать новости, связанные с текущим продуктом. Есть как минимум два способа сделать это.
Вы звоните своим моделям напрямую. Ваша модель для новостей позволяет получать новости о продукте. Вы делаете это в контроллере магазина, который отображает страницу продукта. Этот контроллер должен поместить содержимое в тайник, чтобы шаблоны могли получить к нему доступ.
Вы создаете метод в своем контроллере новостей, который не доступен извне. Вы заставляете его брать идентификатор продукта, находите соответствующие новостные статьи и заполняете их в тайник. Вы отправляете на него с вашего контроллера страницы продукта в контроллере магазина. После этого контроллер страницы продукта продолжается. Это более несвязанный способ.
В обоих случаях ваш шаблон магазина включает в себя другой шаблон, который знает, как обращаться с материалом в тайнике для отображения новостей. Возможно, вы сможете переработать шаблон новостей здесь.
Я не работал над Mojolicious, но IMO это лучший подход -
Ваш контроллер сайта должен отправлять запросы GET любым другим контроллерам, которые он хочет, и эти контроллеры должны возвращать данные JSON, которые затем могут быть отображены на стороне клиента. Посмотрите Рендеринг JSON. Надеюсь, это поможет.
Исходя из моего опыта, кодирования и позора для моего кода, я советую: каждый метод в контроллере должен вызывать только одну функцию и передавать результаты в шаблон. Это как-то похоже на ответ @simbabque.
Это поможет вам позже протестировать контроллер, написать API вместо предоставления HTML-шаблонов, даже полностью изменить каркас (если это Perl).
Итак, я бы добавил необязательный слой между контроллером и моделями:
$t->get('/books/:id')->to('books#get')
sub Books::get{ my $self = shift; my $book = FBooks::get($self->param('id')); # plus template call }
sub FBooks::get{ # here you call your Model }
# your Model calls your DB
Вы предоставляете FBooks::get только тогда, когда вам нужно сделать несколько звонков вашей модели / моделям (возможно, это не идеальный пример, но я надеюсь, что вы поняли мою точку зрения). Я предпочитаю это вместо армии помощников. Если есть какой-то другой лучший способ, я с удовольствием его изучу.