Catalyst::Helper

By | 20.10.2015

Catalyst.pl используют для быстрого создания каркаса catalyst-приложения. Сам скрипт catalyst.pl очень небольшой, единственное, что он делает – вызывает методы Catalyst::Helper, которые выполняют всю работу.

Пример вывода catalyst.pl:

После запуска catalyst.pl создается целая иерархия файлов, скриптов, директорий:

 

Скрипты, которые создает catalyst.pl

Кроме множества других файлов и директорий, catalyst.pl создает несколько скриптов, которые в дальнейшем используются для создания новых компонент, запуска простого web-сервера и т.п.

  • myapp_create.pl – Используется для создания новых компонентов catalyst-приложения: моделей, представлений, контроллеров. Пример:

     

  • myapp_server.pl -Тестовый web-сервер сatalyst. Запускается как http-демон. Выводит отладочную информацию либо на экран, либо в файл. Лично мне больше нравится использовать файлы, которые можно просматривать в произвольном направлении с помощью less, тогда как вывод логов на экран терминала позволяет посмотреть только ограниченное количество последних строк.

     

  • myapp_test.pl -Скрипт для запуска тестов из командной строки.
  • myapp_cgi.pl – Запускает ваше приложение как CGI.
  • myapp_fastcgi.pl -Скрипт позволяет запустить catalyst-приложение как приложение fastcgi.

“myapp” – в приведенных выше примерах, приставка, которая меняется в зависимости от того, какое вы зададите имя для вашего catalyst-приложения при создании каркаса.

 

Helpers

Helpers, “хэлперы”, модули-помощники.

Скрипт myapp_create.pl позволяет создавать такие компоненты приложения как: модели, контроллеры, представления. Разновидностей каждого компонента может быть огромное количество. Например, поиск по фразе “Catalyst::View” возвращает более 100 ссылок на модули. Каждое из представлений в catalyst-приложении выполняет свой вид работы, нуждается в разных настройках и кодах. И это только представления. Естественно, модули могут регулярно обновляться, могут появляться новые View.

myapp_create.pl при всем желании, не сможет содержать в себе код, который используется для создания 100 различных типов представлений. Именно поэтому, myapp_create.pl отвечает только за прием входящих параметров и передачу их Catalyst::Helper, который в свою очередь, передает часть работы
соответствующим модулям-помощникам. Модуль-помощник содержит в себе код, необходимый для создания того или иного представления. Например, для того, чтобы создать представление TT будет вызваны функции модуля Catalyst::Helper::View::TT.

Каждый модуль-помощник может содержать в себе два метода:

  • mk_compclass – создает класс для компонента
  • mk_comptest – создает тест для компонента. Если метод отсутствует, тест не будет создан.

В самом деле, цепочка “передачи обязанностей” по созданию новой компоненты достаточно длинная. Примерное содержимое скрипта myapp_create.pl :

 

Т.е. myapp_create.pl получает задачу создать новую компоненту, вызывает для этого Catalyst::ScriptRunner, Catalyst::ScriptRunner вызывает
Catalyst::Script::Create, Catalyst::Script::Create вызывает Catalyst::Helper, который выполнив определенную работу, вызывает модуль-помощник для создания конкретной компонеты.

Если вы вызовете script/myapp_create.pl view TT TT, Catalyst::Helper, когда дело дойдет до него, попытается выполнить методы Catalyst::Helper::View::TT->mk_compclass и Catalyst::Helper::View::TT->mk_comptest.

Пространства имен для модулей-помощников:

  • Catalyst::Helper::Model::
  • Catalyst::Helper::View::
  • Catalyst::Helper::Controller::

 

Методы Catalyst::Helper

mk_compclass – Метод для создания компонента. Catalyst::Helper создает объект модуля-помощника, после этого вызывает для него метод mk_compclass(). Соответственно, в модуле-помощнике этот метод должен быть определен. Если помощник не содержит метод mk_compclass(), Catalyst::Helper передаст управление своему методу render_file().

mk_comptest – Аналогично описанному выше, но предназначено не для создания компоненты Catalyst, а теста для компоненты.

mk_stuff – Этот метод будет вызван, если пользователь не укажет тип компоненты: модель, представление или контроллер.

 

Внутренние методы Catalyst::Helper

render_file ($file, $path, $vars, $perms) – Формирует и создает файл из шаблона в блоке __DATA__, который размещают в конце файла модуля-помощника. Файл создается с помощью Template Toolkit.

  • $file – соответствующая часть __DATA__ секции,
  • $path – путь к файлу,
  • $vars – ссылка на хэш, которая требуется для Template Toolkit,
  • $perms – желаемые права доступа (если не указать, будут установлены значения по умолчанию)

get_file($class, $file) – Извлекает содержимое для файла из __DATA__ секции. Метод используется внутри render_file(). $class – имя класса из которого будут извлекаться данные.

Пример реального кода модуля-помощника:

 

mk_app – Создает каркас приложения Catalyst, вызывается скриптом catalyst.pl:

 

mk_component($app) – Создает новые компоненты Catalyst-приложения.

mk_dir($path) – Создает директорию.

mk_file($file, $content) – Добавляет извлеченный с помощью get_file() данные в указанный файл. Вызывается render_file().

next_test($test_name) – Вычисляет имя для следующего пронумерованного тестового файла и возвращает его.

render_file_contents – Обрабатывает Template::Toolkit шаблон.

render_sharedir_file – Формирует template/image файл из директории общего доступа.

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