Следуйте принцип Information Expert в директивах ГРАСПА для объектно-ориентированного проектирования:
... место ответственности в классах с большей информацией, необходимой для выполнения его.
Таким образом, вы должны записать в журнал из класса, который содержит данные, необходимые для входа в систему. Если событие, которое вы хотите записать, относится к работе модели, затем записывается в журнал в модели. Если событие хочет, чтобы журнал касался работы контроллера, затем записывается в журнал в контроллере.
Создайте один выход журнала для приложения. В противном случае вам придется искать много файлов журнала, чтобы найти любую диагностическую информацию! Вы можете сохранить объект журнала в Zend_Registry
, чтобы вы могли вызвать журнал из любого класса вашего приложения.
Re ваши комментарии:
Лучше просто неудачу изящно, если регистратор не найден в ожидаемом ключе реестра. Из-за неудачного изящества я имею в виду либо вывести ошибку в stdout (на веб-страницу), либо stderr (в журнал сервера httpd), либо выбросить исключение и позволить приложению обработать его.
Что касается зависимостей, это не проблема. Каждый раз, когда класс использует другой класс, у вас есть аналогичная зависимость. См. Шаблон дизайна Registry.
Но с регистратором, извлеченным из реестра, модель имеет новую «скрытую» зависимость. Если я использую модель в другом приложении - возможно, без регистрации или хранения под другим ключом, тогда попытки получить логгер потерпят неудачу. Итак, должны ли все мои подклассы базовой модели содержать такие методы, как log(), setLogger(), getLogger()? Или это просто избыток? –
Очень полезно, большое спасибо. ;-) –