Catalyst — Perl веб-фреймворк в лучших традициях MVC

Catalyst Perl web frameworkКогда я подыскивал себе MVC веб-фреймворк для небольшого внутрикорпоративного проекта, у меня абсолютно не было опыта работы с паттерном MVC. Я знал лишь то, что данные, их представление и логику работы обязательно нужно разделять. Страшный опыт смешивания этих ингредиентов с получением серо-буро-малинового зелья из перлового кода, HTML и SQL у меня был. Тогда я хотел быстренько найти что-то похожее на Rails, потому что читал про него, но чтобы было на Perl или PHP и чтобы было все просто и красиво. Тогда я собственно и не знал чего толком я хочу, именно поэтому я остановил свой выбор на CakePHP: просто, красиво, была русскоязычная документация и на Руби на Рельсах похоже. Поначалу все было очень хорошо: быстро понял, что к чему, быстро разобрался, куда там код писать... но, потом хлебнул бочку дёгтя из ложки меда.

Я не хочу сейчас писать о том, куда же все-таки девается оперативная память при запросе к БД, почему реализация ActiveRecord в CakePHP настолько неуклюжа, по сравнению с Ruby-аналогом, почему мне легче написать тег элемента формы в ручную, чем использовать HtmlHelper и многое другое.
Простота! = гибкость.

Должен признать, что при всех своих недостатках, CakePHP дал мне понять очень важную вещь, а именно — что же я хочу получить от MVC веб-фреймворка. Я не хочу сказать, что CakePHP — это плохой и абсолютно непригодный для работы фреймворк. Нет. Он очень прост и понятен — и это его огромный плюс, но вместе с этим его возможности ограничены. Простые вещи делаются на CakePHP очень просто, но сложные вещи требуют затратить немалые усилия и по-прежнему остаются очень сложными.
Простота! = гибкость.

Простота CakePHP заключается в том, что все, что вам нужно, находится в одном фреймворке. Библиотечный код для упрощения работы с БД, роутеры для работы с URL, средства для обработки веб-форм и помощники для генерации HTML-элементов стандартны для фреймворка. С другой стороны, вы не можете заменить какой либо элемент фреймворка на тот, что более удобен вам, либо использовать элемент отдельно от фреймворка (модели, например). Все уже сделано за вас. Хотите писать на CakePHP — живите по нашим правилам.

Я глубоко уверен в том, что в фреймворке не должно быть навязанного библиотечного кода, который невозможно, либо очень сложно заменить. Сам MVC фреймворк должен быть клеем между Моделями, Контроллерами и Представлениями. Фреймворк должен предоставлять свободу прикручивать и использовать те компоненты системы, которые наилучшим образом подходят для конкретного проекта. И если фреймворк не будет навязывать свой библиотечный код, то эта задача вполне выполнима.

Catalyst — это элегантный веб-фреймворк

Я не знаю, почему Catalyst называют элегантным веб-фреймворком, но, очень большая доля правды в этом есть. Я бы банально назвал его гибким, мощным и удобным фреймворком. Но, фреймворков с такими эпитетами очень много, а вот элегантный пока только Catalyst.;) В чем же его элегантность гибкость и удобство? Ну, во-первых Catalyst делает только то, что должен делать веб-фреймворк — быть клеем между какими-то Моделями, какими-то Контроллерами и какими-то Представлениями.

Какие-то Модели

Модели служат для отделения логики работы с базой данных от прочего кода в веб приложении. Стоп... Кто сказал, что Модель должна работать только с БД?! Нет... модель служит для того, чтобы предоставлять данные из какого угодно источника. Именно так, вроде бы сказано в определении роли Модели в MVC. Источником данных для Модели может быть все что угодно, начиная плоскими файлами и xml-документами и заканчивая базой данных, веб-сервисами и IM-протоколами.

Модели в Catalyst не содержат огромных кусков библиотечного кода — они предназначены для адаптации существующих Perl-модулей для работы с Catalyst. Коме того, модели могут использоваться отдельно от фреймворка, это очень важный момент, если, к примеру, вы пишите отдельный от фреймворка модуль для импорта/экспорта информации, и хотите чтобы он использовал все те полезные функции, предоставляемые Моделью.

Особого внимания заслуживает вопрос работы с базой данных. Конечно же, вы всегда можете использовать чистый SQL для получения данных из БД. Но, на самом деле намного удобнее использовать ORM’ы — специальные модули, которые помогут вам упростить работу с БД путем замены ваших запросов на чистом SQL на работу с классами, которые возьмут на себя всю черную работу по формированию SQL-запросов и избавят вас от необходимости смотреть на листочек с дизайном вашей БД, каждый раз, когда вы создаете новый запрос, использующий больше чем одну таблицу. Использование ORM сделает ваш код для взаимодействия с БД чище и понятней как вам, так и вашим коллегам. Кроме того, ORM’ы делают ваш код переносимым между разными СУБД, и побочным эффектом использования этой технологии будет избавление от опасности SQL-инъекций. Уж поверьте, качественные ORM’ы следят за правильным формированием генерируемых ими SQL-запросов. Самым популярным ORM для Perl и Catalyst является DBIx: Class. Для него есть хороший мануал и многие другие модули поддерживают DBIx: Class (DBIC), работая с ним, как с родным. Кроме того, в официальных мануалах к Catalyst и других источниках информации вы найдете много примеров с использованием именно DBIC. Но, ваш выбор не ограничивается одним лишь DBIC. На CPAN можно найти еще парочку качественных ORM’ов. Лично я сейчас использую Rose: DB: Object из-за его гибкости и легкости в настройке. Так что, как работать с источником данных можно выбрать, и выбор этот зависит только от вас. Прикрутить Модель к Catalyst можно какую угодно. Вот почему этот блок текста я назвал «Какие-то Модели».

Контроллеры

Вы, наверное, не поверите, но контроллеры также можно прикручивать и откручивать. Сейчас можно упомянуть о том, что Catalyst — это полностью объектно-ориентированный веб-фреймворк. Все базовые классы Моделей, Контроллеров и Представлений наследуется от базового класса Компонент. Это дает вам возможность из Контроллера запросить Модель и настроить Представление. Ваши же Контроллеры наследуются от класса Catalyst: Controller, который реализует несколько базовых функций. Хотите больше? Поменяйте базовый класс! Вот, например, Catalyst: Controller: CRUD реализует код для основных функций чтения/записи в БД. А вот, к примеру, Catalyst: Controller: View делегирует запрос пользователя непосредственно в Представление. Таким образом, всю бизнес-логику можно реализовать в Представлении. Но, это уже, немного, извращение. Хотя, вполне реальное:)

Представления

Я думаю, что уже даже не стоит говорить о том, что представление будет таким, какое вы захотите прикрутить. Чаще всего, функциональность представлений реализуют шаблонизаторы. Их много. Выбирайте на любой вкус и цвет. Самый популярный, мощный и гибкий — это, конечно же, старый добрый Template-Toolkit. К слову, если вы Python-разработчик, то вам будет интересен проект Template-Python, я писал как-то об этой разработке в своем блоге.

Плагины

Есть вещи, которые сложно отнести непосредственно только к Модели, Контроллеру либо Представлению. Вот, скажем, разграничение прав доступа пользователей: в Контроллере вы будете проверять, не запросил ли текущий пользователь запрещенные данные, в Представлении будете решать какие элементы управления показывать пользователю, а в Модели можно вести журнал того, какой пользователь что изменял или удалял. Система разграничения прав доступа это одна сущность, к которой нужно иметь доступ из любой точки проекта. Это всего лишь пример одного плагина, но есть еще целая куча вариантов готовых для работы плагинов на CPAN, которые помогут в решении самых разнообразных задач.

Генераторы кода

Наверно самое сложное для меня — это создать новый файл и с чистого листа начать писать новый модуль. Генераторы кода решают эту проблему. Теперь, чтобы создать новый Контроллер мне достаточно воспользоваться

$ perl myapp_create.pl controller MyControllerName

И в новый контроллер будет помещен стандартный шаблонный код, который позволит сразу же проверить новый контроллер на работоспособность. Опять же есть очень много готовых генераторов кода и ничто не мешает вам создать свой.

Catalyst для Perl

Говорят, что Perl — это старый язык. Конечно же, много воды утекло после выпуска 5-й версии еще в далеком 1994 году. Да, стандартная языковая поддержка ООП не настолько развита, как скажем в Python или Ruby, но у языка Perl есть одна очень интересная особенность. На самом языке можно расширять сам язык. Так что сейчас в Перле могут быть доступны самые удобные вещи из ООП, которые есть в других языках.

Скажем, к примеру, в Perl нет поддержки свойств (property) и их наследования — нет проблем: эту поддержку можно реализовать запросто, использовав модули Class: Accessor: Fast или Class: Data: Inheritable. Не понравилось, как работает алгоритм множественного наследования? — Реализуем свой в Class: C3.
Все эти вещи, и многое другое, активно используются в Catalyst, что позволяет вести комфортную разработку приложений, не отказывая себе в новомодных новшествах в мире ООП.

Полезные ссылки

В этой заметке я не приводил примеров кода, и еще много чего осталось за кадром. Моя цель — обратить внимание сообщества на то, что Perl не пасет задних в области веб программирования, и если вы хотите разработать что-то свое, что-то такое чего еще нет в достаточной мере в популярных CMS’ках — то обратите внимание на Catalyst. Это фреймворк, который избавит вас от необходимости искать «что-то лучшее» или «что-то более гибкое». Catalyst и есть то самое гибкое и... элегантное.;)

catalyst bookВ изучении веб-фреймворка вам поможет официальное вики, официальное руководство.

И замечательная книга Джонатана Роквея «Catalyst» . Конечно, эта книга не бесплатна, но, для человека, умеющего пользоваться Гуглом — это не проблема:)

Все про українське ІТ в телеграмі — підписуйтеся на канал DOU

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn



93 коментарі

Підписатись на коментаріВідписатись від коментарів Коментарі можуть залишати тільки користувачі з підтвердженими акаунтами.
Люди добрые, подскажите куда копать.
Есть каталистические файлы, кодировка простой ansi (OS FreeBSD), база в utf8, при написании русским в шаблоне ТТ все летит:
Если сделать кодировку файла utf-8, то выводится просто пустая страница. Если закодировать ее в cp1251, то как и положено текст выводится ромбиками, при этом все работает, строки из базы выводятся русским.
собственно вопрос как победить русский текст если он просто в шаблоне?

например первая строка шаблона [% META title = ’Источники’ %]

Как то совсем обходят стороной технологию Ajax, имею ввиду документацию и туториалы. В частности нашел небольшой пример с использованием Catalyst: Plugin: Prototype. Возможно этот пример кого то побудит к созданию приличного туториала для Catalyst. Для начала добавляем в проект скрипты, это если мы их захотим подгружать статистически:

./script/MyApp_create.pl Prototype

Подключаем плагин в lib/MyApp.pm

use Catalyst qw/ ... Prototype /;

в root/какойнить.tt добавляем следующий текст содержащий наше магическое поле ввода, предположим это строка ввода отражающая «автора» чего нибудь

<form> [% c.prototype.define_javascript_functions # Добавляем необходимые скрипты %] [% c.prototype.auto_complete_stylesheet # и стили для организации выпадающего списка %] <input autocomplete="off" id="complete_author" name="complete_author" type="text">
[% url = base _ 'proto/suggest' %] [% c.prototype.auto_complete_field( 'complete_author', { url => url } ) %] </form>

Создаем контролер, к которому будем обращаться за списком

./script/test_create.pl Controller Proto

в lib/MyApp/Controller/Proto.pm создаем обработчик запроса по первым введенным символам в наше поле. На основании введенной последовательности создается запрос like к нашей базе данных и формируется список. Список передается браузеру для формирования выпадающего списка.

sub suggest : Local { my ( $self, $c ) = @_; my $complete_author = $c->req->params->{complete_author}; my @suggestions; my $rs = $c->model('DBIC::Journal')->search({ author => { 'like' => $complete_author . '%' }}); while (my $row = $rs->next) { push(@suggestions, $row->author); } $c->res->body($c->prototype->auto_complete_result(\@suggestions)); }

вуаля, вводим первые символы и выпадающий список предлагает нам найденные в базе варианты, магия аля google-поиск стала доступна!

В.tt за < input> съелась строчка с div

<'div class="auto_complete" id="complete_author_auto_complete"><'/div>

должен сказать, что это самое грамотное из русскоязычных обсуждений catalyst’а, на которое я смог наткнуться.

С двойным перекодированием в unicode справился. В MyApp.pm добавляем:

use utf8;...sub enc {    my ( $self, $str ) = @_;    utf8::decode($str);    return $str;}

в шаблоне соответственно:

[% c.enc(item.name) %]

шарясь по интернет много нелестного прочитал про плагин Unicode, но без конкретики. Прикрутив к своему проекту I18N (интернационализацию) столкнулся с проблемой двойного перекодирования шаблона в случае русской локали (возможно это связано с локалью системы по умолчанию). выглядит это так — в конфиге:

# Currently supported locales<localization>    en English    ru Русский    uk Українська</localization>

далее TT шаблон из конфига создает симпатичную менюшку наподобии wikipedia. Да вот незадача, когда нахожусь в ru-локале получаю двойное кодирование шаблона в utf-8. страдает только эта самая менюшка. Пока запускал через app_server.pl, возможно апач это выличит, но глюк налицо. Может кто сталкивался?

Отличная статья! Не смотря что прошёл уже год, но, имхо, она вместе с комментариями является лучшим русскоязычным мануалом по каталисту!

ларчик просто открывается -разобрался как убрать дебаг-информацию при запуске myapp_fastcgi.plнеобходимо из lib/myapp.pm удалить -Debug

Может мои пять копеек и не кмест, но у меня заработало под apache2 с FastCGI

<VirtualHost myhost:80>ServerName myhostErrorLog /var/log/apache2/myhost-error_logCustomLog /var/log/apache2/myhost-access_log commonDocumentRoot "/var/www/myapp/root"Alias /static /var/www/myapp/root/staticFastCgiServer /var/www/myapp/script/budget_fastcgi.pl -processes 3Alias / /var/www/myapp/script/budget_fastcgi.pl/<Directory "/var/www/myapp/root">Order allow,denyAllow from all</Directory><Directory "/var/www/myapp/script">Order allow,denyAllow from all</Directory></VirtualHost>

но есть одна проблемма, myapp_fastcgi.pl вывод (stderr) перенаправляет в ErrorLog. Как бы отключить засерание лога, но покрасивее.

я таки разорабрался, передал $c в new ($c) вызываемого объекта...хотя в примерах так не напичано нигде, в общем работает — пускай работает

подскажите, пожалуйста если можноархитекрутра MVC позволяет инициализировать в модели еще одну модель, если я правильно понял, т.к. это написано в викиесть код упростил я его===package MyApp: Model: Tree; use strict; use warnings; use parent ’Catalyst: Component’; use MRO: Compat; use DBIx: Tree; sub COMPONENT {my ($class, $app, $args) = @_; $args-> {base} = $app-> config-> {base}; return $class-> next: method (@_); } sub new {my ($self, $c) = @_; $self = $self-> next: method (@_); my $sql = “SELECT id_se, name_se, parent_se_idFROM section ”; my $dbh = $c-> model (’DBI’) -> dbh; print ’1111′; my $sth = $dbh-> prepare ($sql); $sth-> execute (); my $id = $sth-> fetchrow_arrayref (); $sth-> finish (); return $id; } 1; ===вызываю: ===my $tt = $c-> model (’Tree’) -> new; # $tt-> tree; use Data: Dumper; print Dumper ($tt); ==выводит: ===$VAR1 = bless ({’stash’ => {}, ’stack’ => [], ’counter’ => {}, ’state’ => 0}, ’MyApp’); HTTP/1.0 200 OK===почему такая эрунда? если в MyApp: Model: Tree добавить еще методов несколько, но их вообще не видно! проблема в sub COMPONENT {, но как это исправить?

некоторые вещи не доделал, в исходники в окончательный вариант еще не фофрмлилстраницы еще не все работаютпосмотрите есть ли ошибки: (perltidy) http://x0.org.ua/perl/cat/еще демо: http://ldap.x0.org.ua (*HTML не оформлял) Админ: логин: test01 mypassюзерлогин: test02 mypass

может что-то в настрйоках? я вот так настроил, по другом не получилсоьтут написано не много другие варианты http://search.cpan.org/~mrambe...кто натраивал FastCGI может что-то добавить?

Options +FollowSymLinks +ExecCGI AddHandler fastcgi-script .pl <Files myapp_fastcgi.pl> SetHandler fastcgi-script </Files>#Options +FollowSymLinks +ExecCGIRewriteEngine onRewriteBase /RewriteCond %{REQUEST_URI} !^/?script/myapp_fastcgi.plRewriteRule ^(.*)$ script/myapp_fastcgi.pl/$1 [PT,L]

апаче:

FastCgiConfig -singleThreshold 2 -minProcesses 1 -maxProcesses 5 -autoUpdate < br> -idle-timeout 170 -killInterval 8 < br> -pass-header HTTP_AUTHORIZATION </code>

Ув. Дмитрий Жарий вы где-то писали что использовали каталист в FastCGI в первом апачеможно узнать зачем? это на хостинге было? у меня в CGI и FastCGI жрет 50 метров на один процесс и процессор сильно грузитв Mod_perl такого нету, показалось что нормальнону вот у знакомого стоит на сервер фастСЦИ... почему каталист ест 50 метров памяти и грузиться 5−15 сек. так должно быть?

Я как-то писал у себя в блоге про установку на хостинг, может поможет: Catalyst и shared хостинг под FreeBSDСмысл в том, что нужно собрать все на такой же ОС, и при помощи PAR перенести скомпилированные модули на сервер в локальную lib приложения. У меня под FreeBSD так получилось. Доступ у меня был только по FTP.


Options +FollowSymLinks +ExecCGIRewriteEngine OnRewriteCond %{REQUEST_URI} !^/?cgi-bin/myapp/script/myapp_cgi.plRewriteRule ^(.*)$ cgi-bin/myapp/script/cgi.pl/$1 [PT,L]

я вот нашел как поставитьвить на хостингтолько не понял что-то не много, навреное еще есть какие варианты установкина хостинге может компилятор не стоятьInstall MVC Catalist to hosting# cpan PAR # cpan PAR: Packerhttp://search.cpan.org/~smuell...http://search.cpan.org/~smuell...add line catalyst_par (); to Makefile.PL from Catalyst# IMPORTANT: if you delete this file your app will not work as# expected. you have been warneduse inc: Module: Install; name ’MyApp’; all_from ’lib/MyApp.pm’; requires ’Catalyst: Runtime’ => ’5.7014’; requires ’Catalyst: Plugin: ConfigLoader’; requires ’Catalyst: Plugin: Static: Simple’; requires ’Catalyst: Action: RenderView’; requires ’parent’; requires ’Config: General’; # This should reflect the config file format you’ve chosen # See Catalyst: Plugin: ConfigLoader for supported formatscatalyst; install_script glob (’script/*.pl’); auto_install; catalyst_par (); WriteAll; # perl Makefile.PL# make catalyst_parmy_app_name.par, it ordinary.tar.gz archive which I carried on it host — machine, and already there decompressed and inundated on the server of hosting.http://unixforum.org.ua/index...

Это вспомогательные модули. И документация есть, вот например: http://search.cpan.org/perldoc...По идее, эти CRUD’ы экономят строки кода, но зато они ограничивают программиста в выборе средств валидации формы и работы с БД.

извините, а зачем сделаныланы эти модули CRUD которые нету в этой стаье, а например: http://search.cpan.org/~mrambe...http://search.cpan.org/~karman...там документации нету, или это просто вспомогательные какие-то?

спасибо не видел Catalyst: Plugin: Form: Processor, интересный! но FormBuilder и FormFu не поравилисьв FormBuilder надо делать текстоый файл с указанием какие данные из форм передаються, это не проблемано когда я хочю добавить какие-то регулярное выражение, удалить пробелы и т.д.есть ли они в FormBuilder? или я не понял? я посмотрел исходники не увиделесли я хочю добавить некоторые другие проверки, например1) проверка валидности пароля2) text tidy3) etсто как мне эти регулярные выражения (проверки) вставить в FormBuilder чтобы не ковырять исходники? вот пример я еще не закончил, но оно функционирует: (то там добавить можно другие проверки и SQL: Abstract (DBIx: Class, etc) прямо туда, хотя не знаю) http://x0.org.ua/perl/ExtraDBI... (извините, без комментариев и не отформатированно) кстате. я статю вот хочу написать про каталист

>>, но я не опнял зачем там используется Catalyst: ControllerТаким образом, FormBuilder инициализирует данные формы, которая описывается в.yaml файле. FormBuilder не знает, какой конкретно файл конфигурации формы ему использовать, и узнать он это может только при вызове Экшена. Именно поэтому он и перехватывает sub create_action. >> в Catalyst: Action если я правильно понял сделан для того чтобы >> «прицепить» к объекту $c методы (только не понятно зачем) Точно не могу сказать, возможно он там что-то и цепляет, но точно скажу, что $c — это единственный способ в Каталисте узнать о параметрах текущего запроса. Все данные формы, и другая информация берется из контекста ($c). Свои методы в $c обычно цепляют Плагины, это удобно, когда нужно чтобы какой-нибудь метод был доступен везде, где есть доступ к $c. 3) вот я написал свой класс! >> что мне надо в него добавить, что он вызывался так как >> Catalyst: Controller: FormBuilder>> my $form = $self-> formbuilder, инициализировался сам? и чтобы методы его >> «диспатчизировались» есл ия правильно понимаюЯ бы не советовал делать нечто похожее на FormBuilder. Это сложно и займет уйму времени. Придется перехватывает те же самые create_action и подобные методы, времени это совсем не сэкономит. Если хочется написать что-то свое, то лучше реализовать это как Плагин, а не контроллер. Вот пример: http://search.cpan.org/perldoc...Я сейчас остановился на HTML: FormFu — из тяжеловесов по обработке форм, считаю его лучшим: http://search.cpan.org/perldoc...

Увадаемый, Дмитрий Жарий, спасибо, что написали статью! я вот хотел еще спросить, не знаю где можно спросить (кстате, а нет ли где-то форумов чтобы там спросить? ну формы чтобы зарегится и спроситьПо каталисту многия документация к ему модулям идет без примеров..., а исходники не читаемые и без комментарием, тоже===нашел модуль Catalyst: Controller: FormBuilder http://search.cpan.org/~jcamac..., решил сделать свой аналогичный, мне он не понравился тем что там надо тэги другие вставлять, и не опнял на счет фильтрации что делать1), но я не опнял зачем там используетсяCatalyst: Controllerhttp://cpansearch.perl.org/src...и методы с негоsub create_action { my $self = shift; my %args = @_; my $attr_name = $self-> fbsetup-> {attr_name}; if (exists $args {attributes} {$attr_name}) { $args {_attr_params} = delete $args {attributes} {$attr_name}; if (my $source_type = $self-> fbsetup-> {source_type}) { $args {_source_type} = $source_type; } push @ {$args {attributes} {ActionClass}}, $self-> fbsetup-> {action}; } $self-> SUPER: create_action (%args); } 2) в Catalyst: Action если я правильно понял сделан для того чтобы “прицепить” к объекту $c методы (только не понятно зачем) http://x0.org.ua/perl/Action.p... sub execute { my $self = shift; my ($controller, $c) = @_; return $self-> NEXT: execute (@_) unless exists $self-> attributes-> {ActionClass} && $self-> attributes-> {ActionClass} [0] eq $controller-> fbsetup-> {action}; my $form = $self-> setupform (@_); Scalar: Util: weaken ($form-> {c}); $controller-> _formbuilder ($form); $self-> NEXT: execute (@_); $controller-> _formbuilder ($form); # keep the same form in case of forwards $self-> setup_template_vars (@_); } от куда это взялось my ($controller, $c) = @_;? что такое $controller? 3) вот я написал свой класс! что мне надо в него добавить, что он вызывался так как Catalyst: Controller: FormBuilder my $form = $self-> formbuilder, инициализировался сам? и чтобы методы его “диспатчизировались” есл ия правильно понимаю вот мой класс: package FormValid; # use strict; use warnings; use base qw (Class: Accessor); PACKAGE-> mk_accessors (qw/name id html text/); sub new { my $class = shift; my $self = bless {}, $class; return $self; } sub disp {my $self = shift; my $name = $self-> name; my $id = $self-> id; my $html = $self-> html; my $text = $self-> text; ...в книге в которую вы привел ив стаье написано про модели, но про контроллеры ничего не написано...

у меня в предыдущей программе не было такого она была в CGI, НЕ Catalystmax_connections=50попробую поставить больше, я не запускаю скрипт, просто запустил script/%app%_cgi.plчерез 5 −10 пробую включить мне говорит сервер гон:) этот скрипт — зто веб сервер правильно? он запускает ускает каталист в CGI

А какое отношение имеет perl script/%app%_server.pl —r к режиму CGI? O_OЕго нельзя запускать под CGI, для этого есть script/%app%_cgi.pl%app%_server.pl —r может иногда глючить и не уничтожать соединения после перезагрузки.А чему равно значение max_connections? В my.ini (активный конфиг файл MySQL). Да, такая проблема вполне возможна, ведь в режиме CGI каждому процессу необходимо свое подключение к базе. Так что тут либо нужно либо увеличить max_connections, либо переходить на mod_perl/FCGI, но сначала, нужно убедится, что такая ошибка воспроизводится на нескольких машинах

часто пишет в режиме CGI через каждых 5 минутperl script/%app%_server.pl -rоно генерит много соединений и не выключает их? как это выключить никто не знает? «DBD: mysql: st execute failed: MySQL server has gone away at /usr/local/lib/perl5/site_perl/5.8.8/Catalyst/Plugin/Authentication/Store/DBI.pm line 175.»

1) >> зачем писать use base qw (Catalyst: Model);? Так сложилось, что Catalyst: Controller и Catalyst: View содержат дополнительные методы, по сравнению с Catalyst: Component. Catalyst: Model их не содержит. Т.е., по сути это тот же самый Catalyst: Component, но в будущем, набор методов базового класса Catalyst: Model может быть расширен. Именно по этому лучше наследоваться от Catalyst: Model. 2) >> подскажите зачем в некоторых методах ставиться два знака подчеркивания? Все зависит от конкретного автора кода. Скорее всего, это просто такой стиль кодирования. Но, в любом случае, если перед именем метода стоит либо один, либо два знака подчеркивания, это означает, что такой метод является внутренним (приватным) для класса и его не следует вызывать извне.

подскажите зачем в некоторых методах ставиться два знака подчеркивания? я это видел только в Катализаторе, больше нигдеsub __setup {}

подскжаите пожалуйста, зачем писать use base qw (Catalyst: Model);? что мы с него вызываем? я пытаюсь сейчас сделать модель... нашел примеры, но примеры везде разные... делаю...

С открытым исходным кодом есть такой проект: http://handelframework.com/

Подскажите, есть ли открытые проекты на Catalyst типа osCommerce или ZenCart? Кто пытался уже строить приложения эл. коммерции с большой поссещаемость?

тоесть это будет так: /lib/controller/Blog/edit.pm

Немного подправлю: /lib/YourAppName/Controller/Blog/Edit.pmТо контроллер будет называться YourAppName: Controller: Blog: EditИ будет автоматически подхвачен и инициализирован Каталистом.

> 1O_O контроллеров? Круто;) там обычный сайт, где-то до 20 модулей (у меня сейчас 10, в одном контроллере 1500−2000 строк не удобного), этот сайт состит планируется на первое время из 3−5 частей, то есть 20файлов * 4частей = 80 модулей, они там будут наследоватся и «диспатчизироватся»...у меня в рошлой прогармме было 30, было на гране...> иерархичными, по типу MyApp: Controller: Blog: Add, MyApp: Controller: Blog: Edit и т.д. без проблем.ваша ссылка сейчас не открывается, попробую по поже...тоесть это будет так: /lib/controller/Blog/edit.pm ?

1O_O контроллеров? Круто;) Да, конечно можно их сделать иерархичными, по типу MyApp: Controller: Blog: Add, MyApp: Controller: Blog: Edit и т.д. без проблем. Можно даже немного похачить Каталист, чтобы у вас было несколько папок «Controller». Я писал про это вот тут: Но, ни разу не применял, так как посчитал что это слишком грязный хак:)

поджскажите у меня планируется сделать контроллеров штук до 100можно ли каталоги сделать иеархичные? /lib/controler/lib0//lib/controler/lib1//lib/controler/lib2/

Для этого нужно пользоваться development веб-сервером, который лежит у вас в script/%app%_server.pl. Его нужно запустить с ключем -r.

$ perl script/%app%_server.pl -r

Тогда он будет перегружаться после изменений кода.

подскажите пожалуйста как сделат ьчтобы при изменении кода в модулях ко применялся в прогармме, чтобы не перегружат ьвсе время веб серверпри mod_perl и CGI всегда нужно перегружать веб сервер, как сделат ьчтобы не перегружать его все время? и в FastCGI тоже надо перегружать чтобы код стал активный?

В своих целях, я использую Apache 1.3.41, под который я успешно настроил FastCGI, и запуск Каталист-приложений, по переведенному Вами мануалу на CPAN. Со вторым Апачем у меня действительно были проблемы, правда немного другого характера, чем описанные вами и мне пришлось от него пока отказаться.

Пишите код так:

<pre><code>тут ваш код</code></pre>

сделал, я сейчас зарегистрируюсь и напишу как получилось...тут гостям запрещено писать код...

вообщем нифига не поулчилось я пробовал с fast-cgi по разному выдает разные ошибки...и везде по разному написано и я не знаю праильно... и ошибки выдаються довольно странныевообще-то авторы которые писали инструкии к настройки веб сервера для каталиста должны были расмотреть варианты, я напрмиер не знаю надо ли мне использовать скрипты в каталоге script...настраивать теперь — это с пушки по воробьям...тут описан http://search.cpan.org/~mrambe... два режима статический и динамический... в динамическом скрипты из каталога script не используются, ошибки веб сервер сегда выдает 403...в логах часто такое [Sun Mar 01 11: 13: 43 2009] [error] [client.81.18] client denied by server configuration: /home/x0/data/www/MyApp/root/

конфиг не получилось получилось сюда опубликоватьподскажите пожалуйста конфиг

кто использовал mod_perl подскажите что надо сделать...везде написано по разному1) в книге котораю тут советовали написано пол страницы — ничего не заработало поствил Catalyst: Engine: Apache 2) тут написано одно http://phpsuxx.blogspot.com/20...3) тут еще другое http://search.cpan.org/~agrund...4), а тут через скрипт http://catalyst.infogami.com/c...фиг поймешь что надо делать...apache2.2.9mod_perlmod_perl2−2.0.4, 3модули в папке lib нужно подгрузть для mod_perl — это понятно...но, а что делать для самого каталиста? нужно ли использовать скрипты в какталоге script? вообщем вот мойт конфиг после переработки, но точный конфиг в гугле я не нашел... точнее нашел, но он не заработа вывел мне «0» сейчас 403 ошибка===PerlSwitches -I/home/x0/data/www/MyApp/libDocumentRoot /home/x0/data/www/MyApp/root SetHandler perl-script PerlResponseHandler ModPerl: Registry PerlModule ModPerl: Registry Alias / /home/x0/data/www/MyApp/myapp_registry.pl/ Options +ExecCGI SetHandler default-handler ServerName x0.org.ua PerlModule MyApp SetHandler perl-script PerlResponseHandler MyAppкто знает скажите что сделать?

фух, я кажется разобрался! спасибо! просто очень много информации не понятно куда бежать и куда смотреть!

Дмитрий Жарий, Ваша демо программа работает, запрещает заходить туда куда не надо, спасибоу меня есть такой модуль я его настроилhttp://search.cpan.org/~janus/...

 PACKAGE->config->{'authentication'} = {    'default_realm' => 'default',    'realms' => {      'default' => {        'credential' => {          'class'               => 'Password',          'password_field'      => 'password',          'password_type'       => 'hashed',          'password_hash_type'  => 'SHA-1',        },        'store' => {          'class'              => 'DBI',          'user_table'         => 'users',          'user_key'           => 'id',          'user_name'          => 'username',          'role_table'         => 'roles',          'role_key'           => 'id',          'role_name'          => 'role',          'user_role_table'    => 'user_roles',          'user_role_user_key' => 'user_id',          'user_role_role_key' => 'role_id',        },      },    },  };id: 1username: adminINSERT INTO roles VALUES (3, '/add1');INSERT INTO user_roles VALUES (1, 3);PACKAGE->deny_access_unless(“/add1″,[qw/admin/],);

не пускает, я эту схемотехнику понять не могу… как можно проверить работает ли этот модуль Catalyst: Authentication: Store: DBI?

или по короче сначалая хотел разрешить вход в 2 раздела только админу, все остальное всем разрешить... не получилосьPACKAGE-> deny_access_unless («/add1», [qw/admin/], ); PACKAGE-> deny_access_unless («/add2», [qw/admin/], );

> Так, хорошо, тогда скиньте еще ваши ACL правила.какие праивила? у меня правил нету в файле нту...я вставил в таблицу одно значение что-бы разрешить доступ...я пробовал поставить те два которые я тут показал...спасибо, но я так и не понял, сначало нужно заперить всем просмативать/выполнять котроллеры? перед тем как разрешать через MySQL? или кто запрещает? перед тем как разрешать? в документации это не нашел — довольно странно...или я перепутал что-то?

Так, хорошо, тогда скиньте еще ваши ACL правила. У меня такое предчувствие, что одно попросту перекрывает другое. Попробуйте создать похожую структуру вашего приложения с вашими ACL правилами вот в этой пустышке: demo-0.01.tar.gz (поправьте demo_server.pl (путь к перлу) и установите необходимые модули) Если оно будет работать там, то значит проблема может быть скрыта где-то в плагине аутотентификации. Если же оно по прежнему не будет работать как надо — то проблема в ACL правилах, и их нужно будет переделать. Что же касается вопроса по Rose: DB: Object — то это просто Маппер (ORM), который работает вне Каталиста, и соответственно просто «забивает» на эти доступы, если, конечно, вы сами не допишете нужный код. Зато очень помогает если много таблиц и отношений (relations) между этими таблицами. Если вы решитесь его использовать, то советую прочитать весь Rose: DB: Object: Tutorial перед началом серьезной работы с ним, это поможет избежать нескольких граблей. В целом, работа с ним намного приятней и проще чем с DBI.

Я это написол просто примерсмотрю по Private [debug] Loaded Path actions: .—±-.| Path| Private|±-±-+| /| /default|| /| /index|| /login| /login/login|| /logout| /logout/logout|| /view| /view/add|| /view| /view/add1|’—±-’кстате, перед тем тем как использовать rose (добавлять записи для возможности просмотра/выполнения контроллеров), нужно сначало запретить просмотр всем у кого нету записай в таблицы? или оно само срабатывает? просто оно «забивает» на эти доступы по-моиму...

Сразу скажу, что в правилах ACL нужно указывать значение из колонки «Private». Т.е. если у меня есть /add1, то в ACL нужно указать /admin/add1

А что это за /add1 и /add2, это контроллеры или экшены? Дайте-ка сюда вашу табличку наподобии этой:

[debug] Loaded Path actions:.-------------------------------------+--------------------------------------.| Path | Private |+-------------------------------------+--------------------------------------+| / | /default || / | /index || /add1 | /admin/add1 || /add2 | /admin/add2 || /admin | /admin/index || /user | /user/index || /user/log_as_admin | /user/log_as_admin || /user/log_as_user | /user/log_as_user |'-------------------------------------+--------------------------------------'

я пробовал все что угодно, но он не пускает никогоя хотел разрешить вход в 2 раздела только админу, все остальное всем разрешить...

PACKAGE->deny_access_unless(“/add1″,[qw/admin/],);PACKAGE->deny_access_unless(“/add2″,[qw/admin/],);

подскажите кто как делал, пожалуйста…возможно тут надо под другому как-то?

извените, понял, там можно просто даже и не подключатся...my $sth = $c-> model (’DBI’) -> dbh-> prepare ( «SELECT...» ); $sth-> finish (); еще подключение можно было бы добавить в конструктор Catalyst: Model: DBIна счет ACL попробую еще некоторый варианты, может оно конфликтует когда вместе с «mysql rose» писать уровни доступа в конфиг...

> Так что он по любому выполнится при завершении работы приложения. спасибо, буду знать, в обычный CGI он не срабатывает наверное> Так что будьте осторожны с сохранением значения $dbh. хорошо посмотрюпочему «осторожны», нельзя через stash? страница когда загрузилсь, то соединение выключилось, если пользователь обновил, то соединение опять пошло и включилось...> Что же касается вопроса по поводу ACL, то ответить не могу, так как в данном случае необходим исходный код приложения.какой именно код? исходники модуля или там где конфиг ACL? обидная проблема, я не решил ее, не знаюя сделал так так как в документации ничего не добавлял...

Я какую-то фигню в 36-м комментарии сказал.: (Хотел показать, что нужно «все глобальное» передавать через stash, а сам допустил грубую ошибку. Если у вас есть класс обвертка над DBI, то используйте его функции. Catalyst: Model: DBI есть метод disconnect. Поэтому нужно использовать его. Кроме того, в деструкторе Catalyst: Model: DBI есть disconnect! Так что он по любому выполнится при завершении работы приложения. Кроме того, $dbh лучше не сохранять в stash. Дело в том, что в случае Catalyst: Model: DBI при вызове метода dbh выполняется некоторый полезный код, который при разрыве соединения с БД пытается его восстановить:

package Catalyst::Model::DBI;# … { … Skip ... } =item $self->dbhReturns the current database handle.=cutsub dbh {return shift->stay_connected;}

Так что будьте осторожны с сохранением значения $dbh. Что же касается вопроса по поводу ACL, то ответить не могу, так как в данном случае необходим исходный код приложения.

PACKAGE-> deny_access_unless ( «/add1», [qw/admin/], ); PACKAGE-> deny_access_unless ( «/add2», [qw/admin/], ); запускается, но почему данный код админа не пускает? он пишет что доступ запрещен, то есть всем запрещает доступя хотел разрешить вход в 2 раздела только админу, все остальное всем разрешить...

sub end: Private { my ($self, $c) = @_; $c-> forward (’MyApp: View: HTML: Template’); my $dbh = $c-> model (’DBI’) -> dbh; $dbh-> disconnect (); } данный код не работает, точнее через один раз идет вывод что примерно: "Server gone"может быть как-то можно переблагословить объект? и там вырубить?:

1, 2 $dbh нужно передавать через stash либо всегда пользоватся $c-> model (’DBI’) -> dbh; т.е. sub begin: Private { my ($self, $c) = @_; my $dbh = $c-> model (’DBI’) -> dbh; $c-> stash-> {’dbh’} = $dbh; ...} sub end: Private { my ($self, $c) = @_; $c-> forward (’MyApp: View: HTML: Template’); my $dbh = $c-> stash-> {’dbh’}; $dbh-> disconnect (); } А на счет примеров, то вот: http://github.com/jrockway/Вот исходники его блога. Это вам может помочь. http://github.com/jrockway/ang...Прямо на Гитхабе можно поискать проекты на Каталисте. Вот еще сайт. Там можно загрузить его исходники (внизу) http://godcore.org.ua/и блог: http://vti.godcore.org.ua/Вот еще проект: http://handelframework.com/blo.../Вот его исходники: http://github.com/claco/handel...Вот про Git

1, 2 $dbh нужно передавать через stash либо всегда пользоватся $c-> model (’DBI’) -> dbh; т.е.

sub begin : Private { my ($self, $c) = @_; my $dbh = $c->model('DBI')->dbh; <strong>$c->stash->{'dbh'} = $dbh;</strong>...}sub end : Private { my ($self, $c) = @_; $c->forward('MyApp::View::HTML::Template');<strong> my $dbh = $c->stash->{'dbh'}; $dbh->disconnect();</strong>}

А на счет примеров, то вот: http://github.com/jrockway/Вот исходники его блога. Это вам может помочь. http://github.com/jrockway/ang...Прямо на Гитхабе можно поискать проекты на Каталисте. Вот еще сайт. Там можно загрузить его исходники (внизу) http://godcore.org.ua/и блог: http://vti.godcore.org.ua/Вот еще проект: http://handelframework.com/blo.../Вот его исходники: http://github.com/claco/handel...Вот про Git

1) как сделать чтобы часть кода была во всех методах сразу при вызове?

sub begin : Private {    my ($self, $c) = @_;   my $dbh = $c->model('DBI')->dbh;          if ($c->user_exists() > 0) {     $c->stash->{user_admin} = 1 if ($c->user->{user}->{username} eq 'test01');    $c->stash->{user_username} =  $c->user->{user}->{username};    }    $c->stash->{user_exists} = $c->user_exists();    }

в других метода ошибка от use strict что $dbh не инициализирован....2) как уничтожыть соединение от бызы во всех методах $dbh->disconnect();навернео не правильно

sub end : Private {   my ($self, $c) = @_;   $c->forward('MyApp::View::HTML::Template');   $dbh->disconnect();}

в документации написано нормально, но примеров реальных я не видел… так что надо телепатировать…где можно найти большой проект и посмотреть как это все делается?

Не могу сказать точно, почему дерево создается только один раз. Возможно, вы используете глобальные переменные для хранения экземпляра объекта DBIx: Tree. Возможно, это баг самого модуля. В любом случае, да, из DBIx: Tree нужно сделать отдельную модель. Рекомендую воспользоваться Catalyst: Model: Adaptor. Попробуйте сделать модель, и возможно, проблема решится сама собой;) На счет mod_perl’a и FCGI, посмотрите на indigoPerl или XAMPP, там уже предустановленны и сконфигурированы такие вещи как mod_perl, FastCGI, SSL и еще много чего полезного...

есть модуль DBIx: Treeпри выполнении в контролере он выполняется один раз, то есть если обновить страницу, то ничего нету, просто страница без дерева...модели или плагина нету, я использовал use DBIx: Tree; тестовая страница без catalyst’а работает нормально с этом модулем...в чем проблема что он выполняется один раз? нужно сделать модель (или плагин) или mod_perl использовать? (я mod_perl никогда не использовал, сейчас проблематично поставить...) (и кстате, catalyst не рекомендуется запускать почему-то в режиме CGI, perl он быстро работает и в CGI)


$c->user->{user}->{username}

работает

вот исходники, что делать не знаюпробовал многое, тоже самое...

sub user { my $c = shift; if (@_) { return $c->user(@); } if ( defined($c->_user) ) { return $c->_user; } else { return $c->auth_restore_user; }}

Caught exception in MyApp: Controller: Root-> index “Can’t use an undefined value as a HASH reference at /home/x0/data/www/MyApp/script/.../lib/MyApp/Controller/Root.pm line 51.”

Попробуйте так: $c-> user-> get-> {username}

подскажите пожалуйста, я не могу вывести имя пользователя который зарегистрирован и активен! использую DBI и HTML: Templateшаблон logged in as.если написать так: $c-> stash-> {user_username} = $c-> user-> {username}; то ничего не выводитесли так $c-> stash-> {user_username} = $c-> userто: Catalyst: Authentication: Store: DBI: User=HASH (0×9ae2ec0) подскажите пожалуйста, как разыменовать этот хэш и вывести имя пользвоателя? отладка: Код: Выделить всё • Развернуть logged in as [info] Request 2 (0.333/s) [42050] [Fri Feb 6 14: 38: 50 2009] [debug] “GET” request for “/” from “127.0.0.1” [debug] Found sessionid “3d04a4a1476d9f6e404f0dc269abc5afce06a4a2” in cookie [debug] Restored session “3d04a4a1476d9f6e404f0dc269abc5afce06a4a2” [debug] $VAR1 = bless ({’store’ => bless ({’user_table’ => ’users’, ’user_role_role_key’ => ’role_id’, ’user_key’ => ’id’, ’user_name’ => ’username’, ’role_table’ => ’roles’, ’role_name’ => ’role’, ’user_role_table’ => ’user_roles’, ’dbh’ => bless ({}, ’DBI: Db’), ’user_role_user_key’ => ’user_id’, ’class’ => ’DBI’, ’role_key’ => ’id’}, ’Catalyst: Authentication: Store: DBI’), ’auth_realm’ => ’default’, ’user’ => {’email_address’ => ’[email protected]’, ’password’ => ’e727d1464ae12436e899a726da5b2f11d8381b26’, ’active’ => ’1’, ’id’ => ’1’, ’last_name’ => ’Blow’, ’first_name’ => ’Joe’, ’username’ => ’test01’}}, ’Catalyst: Authentication: Store: DBI: User’);.не получается разымновать и вывести имя пользователя, аномалия!

http://recoder.livejournal.com/ говорит: 2.02.2009 в 14: 29>> Вот как раз то, что Catalyst даёт свободу и является одновременно его сильной и слабой сторонами.>> Многим разработчикам хотелось бы для каждой проблемы видеть простое и единственное решение.Мне лично намного важнее выбрать из нескольких вариантов самый наилучший для конкретной задачи. Простые решения есть, но разве плохо, что они не единственные? Да, конечно же реализаций шаблонизаторов, ORMов, и средств валидациирендеринга форм целая куча. Но, самые популярные это: ORM: Class: DBI (CDBI), DBIx: Class (DBIC), Rose: DB: Object (RDBO) Шаблонизаторы: HTML: Template, HTML: Mason, Template-Toolkit. Средства обработки и валидации форм: Form: Processor, CGI: FormBuilder, HTML: FormFu, Rose: HTML: Form. Это самые популярные решения. И я думаю, что их не так уж много. Но, этот список можно еще сократить: Учитывая то, что DBIC и CDBI очень похожи по функционалу и подходу, и при этом DBIC по мощьнее будет, то Class: DBI вычеркиваваем. RDBO — это хорошая альтернатива DBIx: Class. Сам сейчас пишу на RDBO. Какой самый легковесный многофункциональный и просто красивый и удобный шаблонизатор? — Template-Toolkit. Form: Processor это попытка упростить Rose: HTML: Form. Честно говоря, не знаю стоит ли что вычеркивать. Но, вот CGI: FormBuilder можно вычеркнуть, так как HTML: FormFu обладает схожим, и более продвинутым и гибким функционалом. Что остается? ORM: DBIx: Class, Rose: DB: Object (RDBO) Шаблонизаторы: Template-Toolkit. Средства обработки и валидации форм: Form: Processor/Rose: HTML: Form, HTML: FormFu. Надежный и мощный союз для создания веб приложения. Все эти модули интегрируются с Каталистом. На самом деле решений для Каталиста много, но самые лучшие, на мой взгляд, перечислены выше.

>> какой контроллер отвичает за страницу loalhost: 3000 (без loalhost: 3000/list) не могу найтиCMyApp: Controller: Root и экшен index

Вот как раз то, что Catalyst даёт свободу и является одновременно его сильной и слабой сторонами.Многим разработчикам хотелось бы для каждой проблемы видеть простое и единственное решение.

> Хм..., а что значит «ярче», в вашем понимании этого слова? Преимуществ Каталиста по сравнению с чем? Не совсем понимаю, поэтому отвечу, > основываясь на собственных предположениях.сделать функции, точнее методы и их мощностями ООП, tie и анонимными массивами «раскрутить» и всё...кстате, вопрос по поводу каталиста: какой контроллер отвичает за страницу loalhost: 3000 (без loalhost: 3000/list) не могу найти

>> ну такое как каталист можно написать на много «ярче» с использованием магии, функции tie>> короче, так какие вы приемущиства увидели от catalyst? я не нашел покаХм..., а что значит «ярче», в вашем понимании этого слова? Преимуществ Каталиста по сравнению с чем? Не совсем понимаю, поэтому отвечу, основываясь на собственных предположениях. Да. Каталист это не простой скриптик, в теле которого обрабатываются данные и запросы к базе данных, реализуется так называемая «бизнес-логика», которая и реализует ту цель, ради которой и задумывалось создания скрипта, и создает HTML отчет. При этом HTML теги мешаются с кодом бизнес-логики и и запросами к БД.Я не говорю, что все такие скрипты плохие. Нет, они могут достаточно легко поддерживаться и эффективно решать поставленную задачу. Такие скрипты не плохие, пока не начинают разрастаться. В конце концов, они могут превратится в мешанину из HTML, SQL и Perl. И я не с неба беру эти слова. Я опираюсь на собственный опыт.Если сравнивать Catalyst с другими существующими Перловыми фреймворками, то все остальные либо слишком молоды (Mojo), либо слишком мертвы (Maypole), либо недостаточно эффективны для решения моих задач (CGI: Application). Кстати, можете посмотреть перечисленных фреймворки, возможно какой-нибудь вам подойдет. Как веб фреймворк, Каталист мне нравится тем, что у него есть довольно активное сообщество. Новые модули для Каталиста обновляются довольно часто, и в принципе, на CPAN можно найти довольно много готовых решений. Я не трачу время на разработку собственных велосипедов. Некоторое время уходит, на то, чтобы разобраться с интересующим меня модулем, но оно в разы меньше, чем если бы я писал что-то с нуля. Каталист дает свободу. Само ядро каталиста (то, что Catalyst-Runtime) содержит минимум библиотечного кода, который не навязывает вам чем нужно пользоваться для работы с БД или рендерить HTML/XLS/PDF. Каталист — это каркас. Удобный объектно-ориентированый каркас для вашего приложения. А то, как я буду работать с данными и какие модули использовать — это уже на мое усмотрение. Мне нравится такая свобода. Я не говорю, что Каталист сверх легкий для изучения фреймворк, и то что он сверх качественно и понятно документирован. Нет. Нужно разбираться, читать мануалы и рыться в исходном коде. Но, оно того стоит. По крайней мере, я в этом уверен.

Дмитрий Жарий, кстате, ну такое как каталист можно написать на много «ярче» с использованием магии, функции tie:) короче, так какие вы приемущиства увидели от catalyst? я не нашел пока

>> Can’t locate Catalyst/Plugin/Authentication/Store/DBI.pm in @INCЭто значит, что все таки Catalyst: Authentication: Store: DBI у вас нет.Попробуйте еще раз: $> sudo cpan Catalyst: Authentication: Store: DBIНе забудьте внести этот модуль в Makefile.pl вашего проекта, для того, чтобы он ставился автоматом в будущем. >> чтобы поставить надо знать что такое Session: Store: DBI — это модель, >> контроллер или view? Нет, это Плагин. Он будет работать абсолютно прозрачно, когда вы его настроете правильно. Он самостоятельно будет сохранять Куки и логинить пользователя, когда вы вызовете $c-> authenticate ({name => $name, password => $pass}) >> ЗЫ: каталист с певрого раза не очень понравился, так как все равно >> всё надо переделывать под свои нужны и телепатировать с >> разработчикамиМне тоже, по началу, не понравился. Да, есть немного сложностей и запутанностей. Но, после того как я прочитал книгу, порылся в исходниках проектов на Каталисте — мне стало ясно что, где и как происходит, и как это использовать.Кстати, могу рекомендовать следующие модули, к которым я пришел, перепробовав кучу других: Rose: DB: Object — гениальный ORM, потому что простой, понятный и удобный. http://search.cpan.org/perldoc... FormFu: http://search.cpan.org/perldoc...Увесистый, но очень удобный.

делаю как в книге, только использую DBI вместе DBIx: Classuse Catalyst qw/ConfigLoader Static: Simple Session Session: State: Cookie Session: Store: DBI Authentication Authentication: Store: DBI Authentication: Credential: Password Authorization: Roles Authorization: ACL/; # setup sessions, authorization, and authentication## ACL rulesPACKAGE-> deny_access_unless (’/admin’, [qw/admin/]); ругатеся: perl script/myapp_server.plCan’t locate Catalyst/Plugin/Authentication/Store/DBI.pm in @INC (@INC contains: /home/x0/data/www/MyApp/script/.../lib /usr/local/lib/perl5/5.8.8/BSDPAN /usr/local/lib/perl5/site_perl/5.8.8/mach /usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.8/mach /usr/local/lib/perl5/5.8.8.) at /usr/local/lib/perl5/site_perl/5.8.8/Catalyst/Utils.pm line 270.Compilation failed in require at script/myapp_server.pl line 55.модули в системе стоят, эти модули мне нужно поставить в мой проект? то как поставить их с DBI? нигде не написано...чтобы поставить надо знать что такое Session: Store: DBI — это модель, контроллер или view? на что именнно он ругается скажите пожалуйста? ЗЫ: каталист с певрого раза не очень понравился, так как все равно всё надо переделывать под свои нужны и телепатировать с разработчиками

Да это сообщество я и создавал. Вот только критической массы участников оно не смогло набрать.А больше общаться негде... Пока читаю официальные англоязычные списки рассылки — и собственно всё.

Ну, есть сообщество: http://community.livejournal.c.../ но, оно довольно слабое. Я обычно ищу информацию на англоязычных ресурсах.

А существуют ли какие-то места для общения русскоязычных разработчиков на Catalyst’e?

С русскоязычной докой увы... не сложилось: (Можете поискать книгу, которая была рекомендована в заметке, с ее помощью можно научится работать с Каталистом без особых знаний английского: очень интересно, просто и понятно написана.

Может кто подскажет — есть ли русская документция к этому чудному фреймворку? Или к примеру исходники какого нибудь приложения с русскими коментариями.

Доклад (видео) Романа Беликина по теме: MVC + Catalyst можно посмотреть на YAPC: TV — http://yapc.tv/2008/fe/roman-catalyst

Не поленитесь вытянуть исходники Catalyst из svn-репозитория:

$ svn co http://dev.catalyst.perl.org/r...

там есть очень полезные примеры простых приложений, включая небольшой форум. Есть проект форума. Foorum называется. Живое демо можно посмотреть тут. Могу посоветовать еще движок блога на Catalyst. Там есть хорошие примеры использования Rose: DB: Object.===И, пользуясь случаем, вот еще один пример проекта на Catalyst: Сервис по поиску соседей по квартире http://delim.com.ua/Изображение Какталистовой молекулы в (http://delim.com.ua/favicon.ic...) выдает то, какую технологию применили создатели сайта. Вспомнил о проекте, потому что когда-то читал заметку на Хабре.

Подскажите экзампл, с которого можно начать написание веб-проекта, например по типу форума?

2 Всеволод Соловьёв

И в новый контроллер будет помещен стандартный шаблонный код, который позволит сразу же проверить новый контроллер на работоспособность.

По файлу на контроллер? Шаблонный код? Фу-фу, я слышу запах Джавы.

А я считаю такой подход очень удобным. По крайней мере такой подход сейчас очень популярен. Но, если очень и очень хочется — то можно держать и много контроллеров в одном файле. Есть там такой корневой контроллер Root.pm, который создается для каждого проекта Catalyst, действия которого вызываются прежде действий других контроллеров. Это нужно, например, для собственной обработки HTTP-ошибок, как то 404-я или 500-я, но, можно и перехватывать вызовы других контроллеров и обрабатывать их по-своему. С другой стороны, можно кастумезировать обработчик запросов Catalyst: Dispatcher, и создать свой, локальный..., но это уже немного усложнит код проекта;)

Нет, нет. Возможно, я где-то неоднозначно выразился, но я абсолютно не имел ввиду что Контроллер работает непосредственно с БД. Нет. Для работы с источниками данных контроллер использует Модель. Ответы на вопросы я дам после блока исходников. Вот пример одного Действия Контроллера, которое выполняет валидацию данных и сохраняет их посредствам Модели в БД.

# Отрывок из Контроллера BoostedTest::C::Testplansub create : Local {    # Для работы с формами используется Rose::HTML::Form.     # Для работы с БД используется ORM Rose::DB::Object.    # ==================================================         my ( $self, $c ) = @_;    # $c - это переменная контекста запроса. Содержит данные о текущем    # запросе пользователя. $c - это переменная, через которую     # запрашиваются другие элементы фреймворка (Модели, Представления,     # другие Контроллеры, Плагины, Объекты Request и Response)    my $form = BoostedTest::Form::Testplans::Edit->new();    $form->context_init($c);# Это специфика Rose::DB::Object. Для работы с одной записью,     # используется Rose::DB::Object а для группы --     # Rose::DB::Object::Manager. Я считаю это разделение удобным,     # но вот, скажем, в популярном DBIx::Class такого разделения нет     my $testplan = $c->model('Testplan')->create();    my $iterator = $c->model('Testplan')->manager->get_testplans_iterator;    if ( $form->was_submitted and $form->validate ) {        # Rose::DB::Object и Rose::HTML::Form интегрированы между собой,         # для удобства их совместного использования. Так что из метода         # объекта формы можно инициализировать  объект ORM и дальше работать         # с ним.                        $testplan = $form->testplan_from_form($testplan);    $testplan->save;    $c->stash->{message} = "Added!";    }    # $c->stash->{testplans}     # Stash - это посредник для передачи переменных в шаблон.     # В любой шаблон. В данном случае используется Template toolkit    $c->stash->{testplans} = $iterator;    $c->stash->{form} = $form;    $c->stash->{template} = 'testplans/create.html';}

Модель выглядит так:

package BoostedTest::M::Testplan;use strict;use warnings;use base qw[ Catalyst::Model::RDBO ]; PACKAGE->config(                     name      => 'BoostedTest::RDBO::Testplan',                     manager   => 'BoostedTest::RDBO::Testplan::Manager',                     # load_with => ['foo', 'bar', 'wtf']                   );1; # Magic end of model ;)
Класс BoostedTest::RDBO::Testplan содержит сгенерированную автоматически структуру таблицы, с информацией о типах полях и связях между таблицами. Пользовательские методы для работы с БД (получение 3-х последних записей и т.д. ) можно дописывать в Модель. Теперь конкретно по вопросам:

Зачем делегировать запрос в V? Также было упомянуто что работой с БД занимается C.Зачем тогда вообще модель в такой системе? Если это считается извращением, то что оно вообще делает в библиотеке?

И

Так должно бы быть, но автор написал:Вот, например, Catalyst::Controller::CRUD реализует код для основных функций чтения/записи в БД.

Catalyst::Controller::CRUD и Catalyst::Controller::View это не часть основной библиотеки Catalyst. Все ваши Контроллеры, по умолчанию, наследуются от Catalyst::Controller. А те два модуля, представленные выше – это всего лишь доработка и изменение поведения Catalyst::Controller, от которого они наследуются. Для Catalyst есть две основных библиотеки Catalyst-Runtime и Catalyst-Devel. Для работы (продакшн) приложения на Каталисте требуется обязательно только Catalyst-Runtime. Все же остальные модули являются надстройками и в некоторых конкретных ситуациях способны упростить жизнь разработчику, но они необязательны. В Perl принято называть модули по принципу «что делает модуль». Модули с общим префиксом могут не быть частями одной большой библиотеки, и зачастую так и происходит. Вот пример:Есть модули CGI, CGI::Tiny, CGI::Simple. На самом деле это разные модули, написанные разными людьми, но чтобы было понятно, что они служат для работы с CGI – у этих модулей один и тот же префикс. Вот пример по поводу Catalyst::Controller::View. Предположим у вас есть приложение, которое не взаимодействует с пользователей через формы. Просто отображает информацию. Что-то там мониторит выводит информацию и рисует графики. Дело в том, что приложения на Catalyst переносимы между различными серверными конфигурациями. Будь то mod_perl, cgi, FastCGI – не важно, ваше приложение не требует переписывания для переноса на другую конфигурацию. При использовании чистого Perl’a, без фреймворков – проблемы переносимости могли бы быть, с Каталистом их не будет.

ORM лежит слоем ниже модели или используется как mixin? Упомянута работа с БДиз контроллера. Как в таком случае читает данные модель? Или они читаются только при инициализации?

Из Контроллера запрашивается модель ( как показано в примере выше ) и далее работа ведется по средствам ORM’а. В примере, в шаблон был передан итератор. Вот пример его использования в шаблоне:

[% WHILE ( testplan = testplans.next ) %][% testplan.name %] [% testplan.created %][% END %]  

Модели используются для того чтобы адаптировать источник данных (в данном случае ORM ) для удобной работы с Catalyst. ORM лежит слоем ниже.

Еще интересна история фреймворка: кому, когда и по какой причине захотелось для веб-разработки на Перле использовать MVC? Кроме веба он способен на что-то еще?

Я думаю, что Perl ничем не уступает ни Python, ни PHP, ни Ruby. Просто Перл немного сложнее в изучении. В Catalyst, к примеру, очень много чего похожего из Rails (это все таки Опен Сорс, и хорошие идеи необходимо реализовывать). Так если на Rail можно создавать красивые веб-сайты, то почему бы не делать этого на Catalyst? Кроме того, у Perl намного больше различных модулей для работы с источниками данных, парсинга текста и много-много другого. И… Perl просто работает быстрее Ruby. Вот, могу посоветовать почитать следующею очень интересную заметку: Catalyst: Perl’s answer to Ruby on Rails and AJAXP.S: советую посмотреть еще один сайт, разработанный на Catalyst: http://godcore.org.ua/

Может и базовые, подожду ответы.

Сергей, видать вопросы были слишком базовые.Ничего страшного — кому-то другому пригодятся, типа FAQ (; Да и писал я спросонья (=Тогда...

Кроме веба он способен на что-то еще?

Ну, можно писать GUI с wxWidgets.

Максим, я надеялся что по вопросам ясно что я знаю что такое MVC, а вопросы относятся к реализации и рекомендуемых подходах в Catalyst. Спасибо за ответы, но зря трудились.Насчет:

Нет, с БД (или другим источником информации) работает M.

Так должно бы быть, но автор написал:

Вот, например, Catalyst: Controller: CRUD реализует код для основных функций чтения/записи в БД.

Зачем делегировать запрос в V?

Думаю, это просто такая потенциальная возможность.У каждого ведь свои подходы к написанию.

Также было упомянуто что работой с БД занимается C. Зачем тогда вообще модель в такой системе? Если это считается извращением, то что оно вообще делает в библиотеке?

Нет, с БД (или другим источником информации) работает M.C лишь принимает запрос, что и из какой M взять и какому V это скормить.Результат работы V отправляется клиенту. Вроде так.

Еще интересна история фреймворка: кому, когда и по какой причине захотелось для веб-разработки на Перле использовать MVC? Кроме веба он способен на что-то еще?

IIRC, MFC тоже сделан по этой моделе. Еще Java Swing.GUI framework-и часто по такой моделе делаются.В принципе, MVC — это pattern, по-этому можно использовать где угодно.

ORM лежит слоем ниже модели или используется как mixin?

ORM — тоже pattern. Почитайте о этом всем на WP. Моделью может бытьмодуль с двумя функциями: прочитать число из файла, инкрементировать его, записать обратно и вернуть контроллеру;, а вторая тоже самое, только декрементировать. И это будет модель, да. А ORM — этоодин из методов абстракции поверх БД (а может и данных вообще).

Спасибо за статью. Есть несколько вопросов.

А вот, к примеру, Catalyst: Controller: View делегирует запрос пользователя непосредственно в Представление. Таким образом, всю бизнес-логику можно реализовать в Представлении. Но, это уже, немного, извращение.

Зачем делегировать запрос в V? Также было упомянуто что работой с БД занимается C. Зачем тогда вообще модель в такой системе? Если это считается извращением, то что оно вообще делает в библиотеке? Мне понятно желание схлопнуть разные компоненты, но непонятно зачем тогда изначально брать MVC? Есть ли у вас пример когда одна и та же модель использовалась с разными V и C? Еще интересна история фреймворка: кому, когда и по какой причине захотелось для веб-разработки на Перле использовать MVC? Кроме веба он способен на что-то еще? ORM лежит слоем ниже модели или используется как mixin? Упомянута работа с БД из контроллера. Как в таком случае читает данные модель? Или они читаются только при инициализации? Заранее спасибо за ответы.

И в новый контроллер будет помещен стандартный шаблонный код, который позволит сразу же проверить новый контроллер на работоспособность.

По файлу на контроллер? Шаблонный код? Фу-фу, я слышу запах Джавы.

Підписатись на коментарі