Кто-то, как правило, пишет все, что вы показали в Catalyst :: Controller.Теперь вы должны помнить, что существует контроллер Catalyst для сопоставления ваших URL.Конечно, можно импортировать множество функций в контроллер, но когда Catalyst сам импортирует функцию log
, как вы используете эту функцию для сопоставления URL-адресов?
Например, sub log : Local { ... }
.В скором времени это будет невозможно, или это будет сложнее, чем должно быть.Контроллер почти не имеет функций, поэтому вам не нужно запоминать много функций и не возникает никаких конфликтов.
По той же причине, по которой сам Perl решил использовать специальные символы в специальных переменных.Как $/
, $_
, $]
и так далее.Конечно, они могут также использовать $INPUT_RECORD_SEPARATOR
или $RS
в качестве значения по умолчанию, но тогда вам нужно знать их, и это, вероятно, может конфликтовать с вашим кодом, если вы не знаете всех специальных переменных.
Другая причинав том, что ваши дополнительные функции, которые вы вызываете на $c
, имеют некоторый контекст.Например, вы можете включить или отключить ведение журнала с помощью $c->log->disable('warn', 'error')
или просто включить их.Этот контекст правильно передается в более глубокий контроллер.И они не являются глобальными, вы можете установить их при каждом запросе в другое состояние.
Другая причина заключается в том, что используемая вами дополнительная функциональность может, а иногда и необходима для чтения файла конфигурации или других вещей.Использование объекта, который вы передаете для каждого запроса (каждый $c
является особенным для каждого запроса) и может изменяться для каждого запроса, дает вашему расширению возможность запрашивать информацию из вашего приложения или обрабатывать состояние для определенного запроса.
Но если вы все еще не хотите этого, вы не обязаны использовать $c
.Например, вы можете просто загрузить Log :: Log4Perl вручную и использовать для этого специальный конфиг, а вовсе не использовать $c->log
.Или вы можете импортировать много функций самостоятельно.Но я думаю, что по умолчанию не загрязнять пространство имен и давать вам возможность делать что-то особенное для каждого запроса, это хороший вариант по умолчанию.
И, по крайней мере, не существует правила, которое вы должны использовать $c
.Например, я сам использую DateTime напрямую и создаю новые объекты и не использую Catalyst :: Plugin :: DateTime, который позволяет мне делать $c->datetime
.И я не вижу никакой пользы от последнего.То, что существует множество плагинов, расширяющих $c
, не означает, что они полезны, или вы должны их использовать.