Доступ к методам из другого контроллера CakePHP или лучшей альтернативы!

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

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

Тем не менее, я не могу решить, как лучше обновить награды - скажем, например, вы делаете определенное количество комментариев и получаете награду за это, CRON будет недостаточно, иначе пользователь может посетить свой профиль, ожидая награды и не иметь его, пока не будет запущен CRON.

Я думал об использовании requestAction() для вызова метода для обновления наград в контроллере Award, однако это не совсем соответствует шаблону проектирования MVC, и я подумал, что должен быть лучший способ!


person Tom    schedule 21.10.2009    source источник
comment
Фактическое название модели, значки или репутация не имеют отношения к вопросу. Вы можете думать об одной и той же ситуации с разными сущностями.   -  person Adriano Varoli Piazza    schedule 21.10.2009
comment
ну, я хотел дать некоторый контекст этому вопросу, поскольку это может иметь значение для ответа о том, что награды могут быть получены за различные действия на веб-сайте, происходящие в разных контроллерах, и другие события, не находящиеся под непосредственным влиянием пользователя (для пример получения комментариев от других пользователей)   -  person Tom    schedule 21.10.2009
comment
Извините, я имел в виду комментарий о том, как вы отметили вопрос, а не текст. Можно упомянуть все, что там   -  person Adriano Varoli Piazza    schedule 21.10.2009


Ответы (2)


Если единственный способ получить награду — оставить комментарий, я бы просто переопределил Model::save, чтобы определить, добавляется ли новый комментарий. Если это так, сделайте вызов модели наград, чтобы обновить награду.

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

Или может я не понимаю вопроса?

person Travis Leleu    schedule 21.10.2009
comment
Спасибо, у меня есть около 20 различных наград, каждая из которых имеет связанный метод проверки. Как вы думаете, мне следует переместить их из контроллера наград в AppModel? - person Tom; 22.10.2009
comment
Я думаю, что я бы, вероятно, в тот момент времени. Имея более 20 наград, было бы гораздо лучше иметь этот код централизованным для выполнения проверок. Компромисс заключается в том, что вы будете проверять условия при каждом сохранении, даже если вы обычно этого не делаете. Так что это будет стоить вам некоторого времени выполнения, но я думаю, что это будет легко сбалансировано ремонтопригодностью кода. - person Travis Leleu; 22.10.2009
comment
Чтобы уменьшить износ, я мог бы предоставить список наград для проверки в каждой сохраненной модели, поэтому в модели комментариев он будет проверять только награды, связанные с комментариями и т. д. Я думаю, что комбинация всех советов здесь должна помочь! - person Tom; 22.10.2009
comment
Я думаю, что это было бы самым правильным типом решения - хороший баланс. Большая часть работы, которую я делаю, относится к сфере быстрых прототипов, поэтому я, вероятно, поместил бы ее в метод AppModel::save() просто потому, что так он быстрее. Рад, что вы нашли решение, которое соответствует вашим потребностям. - person Travis Leleu; 22.10.2009

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

person ondrobaco    schedule 27.10.2009