Основные принципы работы с MVC Framework Catalyst

в 15:09, , рубрики: catalyst, framework, mvc, perl, web-разработка, Веб-разработка, метки: , , , ,

Предисловие
На Хабре очень мало, точнее совсем нет статей о таком замечательном MVC фреймворке, как Catalyst. И поэтому свою первую статью я решил посвятить именно ему.
Здесь я описал основные принципы для работы с Catalyst на примере простенького веб-приложения, так называемый быстрый старт для освоения данного фрейморвка

Введение
Catalyst — это мощный MVC фреймворк для разработки веб-приложений на Perl.
Пару слов об MVC (Model/View/Controller):

  • Модель (Model) — содержит только данные и методы для работы с ними.
  • Вид(View) — отвечает за то, как именно эти данные будут выглядеть.
  • Контроллер(Controller) — управляет связью между системой и пользователем, а также контролирует необходимые взаимодействия при работе приложения.

Catalyst — содержит обширное количество модулей CPAN, которые облегчают разработку веб-приложения на языке Perl.

В чем состоит простота при использовании данного фреймворка?

Процесс создания создания нового проекта выполняется с помощью команды: catalyst.pl Test::App (в файловой системе в директории с названием проекта "::" будет заменен на "-".

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

Структура созданного проекта:

  • /lib — сердце проекта, содержит весь perl код, предназначенный для работы веб-приложения, состоит из поддиректорий, созданных автоматически:
    1. Test/App/Model — для модулей реализующих модель;
    2. Test/App/View — … вид;
    3. Test/App/Controller — … контроллер;
    4. Test/App/App.pm — модуль, для настройки веб-приложения.

  • /root — здесь хранятся шаблоны для View, необходимые css, js, изображения, вообщем все статические данные;
  • /script — содержит скрипты, которые были автоматически созданы Helper'ом. Они необходимы для запуска:
    1. тестового сервера;
    2. тестирования определенного URL;
    3. создания компонентов MVC;
    4. запуска скриптов как CGI/FastCGI;
    5. и т.д.

  • /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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js