Предисловие
На Хабре очень мало, точнее совсем нет статей о таком замечательном MVC фреймворке, как Catalyst. И поэтому свою первую статью я решил посвятить именно ему.
Здесь я описал основные принципы для работы с Catalyst на примере простенького веб-приложения, так называемый быстрый старт для освоения данного фрейморвка
Введение
Catalyst — это мощный MVC фреймворк для разработки веб-приложений на Perl.
Пару слов об MVC (Model/View/Controller):
- Модель (Model) — содержит только данные и методы для работы с ними.
- Вид(View) — отвечает за то, как именно эти данные будут выглядеть.
- Контроллер(Controller) — управляет связью между системой и пользователем, а также контролирует необходимые взаимодействия при работе приложения.
Catalyst — содержит обширное количество модулей CPAN, которые облегчают разработку веб-приложения на языке Perl.
В чем состоит простота при использовании данного фреймворка?
Процесс создания создания нового проекта выполняется с помощью команды: catalyst.pl Test::App
(в файловой системе в директории с названием проекта "::" будет заменен на "-".
Этот скрипт является частью вспомогательной системы, которая имеет название Catalyst::Helper, которая генерирует необходимые скрипты, папки, тесты, файлы и т.д для будущего приложения.
Структура созданного проекта:
- /lib — сердце проекта, содержит весь perl код, предназначенный для работы веб-приложения, состоит из поддиректорий, созданных автоматически:
- Test/App/Model — для модулей реализующих модель;
- Test/App/View — … вид;
- Test/App/Controller — … контроллер;
- Test/App/App.pm — модуль, для настройки веб-приложения.
- /root — здесь хранятся шаблоны для View, необходимые css, js, изображения, вообщем все статические данные;
- /script — содержит скрипты, которые были автоматически созданы Helper'ом. Они необходимы для запуска:
- тестового сервера;
- тестирования определенного URL;
- создания компонентов MVC;
- запуска скриптов как CGI/FastCGI;
- и т.д.
- /t — содержит тесты
- Changes — история изменений вашего проекта.
- Makefile.PL — служебная инфорамация для установки необходимых модулей при развертывании приложения.
- test_app.conf — файл конфигурации, указываются служебные переменные (имеет наибольший приоритет, при запуске, чем настройки внутри приложения).
- README — информация о запуске приложения, его установки, настройки и т.д.
Добавление необходимых моделей/видов/контроллеров производится с помощью соответствующей команды: script/test_app_create.pl {model|view|controller} {имя компонента}
Содержимое файла TestApp.pm
package Test::App;
use Moose;
use namespace::autoclean;
use Catalyst::Runtime 5.80;
use Catalyst qw/
-Debug # включает режим отладки
ConfigLoader # возможность настройки приложения
Static::Simple # обслуживание статических файлов из /root
/;
extends 'Catalyst';
our $VERSION = '0.01';
__PACKAGE__->config(
name => 'Test::App',
disable_component_resolution_regex_fallback => 1,
enable_catalyst_header => 1, # Send X-Catalyst header
);
# стартует приложение
__PACKAGE__->setup();
1;
Как мы видим Catalyst использует для объектного отображения используемых элементов CPAN модуль Moose, что значительно упрощает работу с объектами в языке Perl.
Файл Root.pm который находится в папке /lib/Test/App/Controller/ выглядит так:
# содержит методы необходимые для взаимодействия с приложением, обработки запросов и генерации ответов.
package Test::App::Controller::Root;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller' }
__PACKAGE__->config(namespace => '');
# начальная страница, об этом говорит цифра Args(0), цифра внутри, указывает количество параметров в url (прим. test.com/1a/2b/3c при Args(1) получим "1b" и т.д)
sub index :Path :Args(0) {
my ( $self, $c ) = @ _;
# Hello World
$c->response->body( $c->welcome_message );
}
# для всех остальных запросов, для которых не найдены соответствующие указания, генерирует ошибку 404
sub default :Path {
my ( $self, $c ) = @ _;
$c->response->body( 'Page not found' );
$c->response->status(404);
}
# метод, выполняющийся в конце обработки запроса
sub end : ActionClass('RenderView') {}
1;
Теперь после знакомства с этим фреймворком, попробуем создать простое веб-приложение.
1. Создадим вид с помощью команды script/test_app_create.pl view Web TT
(ТТ — Template Toolkit, шаблонизатор, можно также использовать другие шаблонизаторы, Mason например)
2. Создадим файл index.tt в папке root/
Вставляем туда этот код:
[% IF result %]<p>[% result %]</p> [% END %]
<form name="hello" method=POST action="hello">
<input type="text" name="hi" value="">
<input type="submit" value="Do something!">
</form>
3. В файле Root.pm удаляем такую строчку: $c->response->body( $c->welcome_message ); # вывод стандартного окна приветствия
4. там же добавляем метод hello:
sub hello :Local {
my ($self, $c) = @ _;
my $hi = $c->req->body_params->{hi};
$c->stash(
result => $c->model('Hello')->hello($hi),
template => 'index.tt',
);
}
5. Создаем модель script/test_app_create.pl Model Hello
6. В созданной модели пишем метод:
sub hello {
my ($self, $hi) = @ _;
return "Hello $hi!n";
}
7. Запускаем тестовый сервер script/test_app_server
8. В браузере вводим localhost:3000/
(порт по умолчанию)
Любуемся результатом.
P.S. Вот в принципе основные идеи при работе с Catalyst, и хотелось бы побольше статей на хабре от, знающих этот фреймворк, людей. Документация конечно хорошо, а вот реальный опыт всегда интересней.
P.P.S. Пока писал эту статью и тут не обошлось без магии перла. В коде используется массив "@_", который транслируется в тэгах при указания языка перл в читателя с именем "_", ничего красивого не придумал, как поставить пробелы между @ и _. Будьте внимательны…
Автор: edem