Catalyst – Perl веб-фреймворк в лучших традициях MVC
Дмитрий ЖарийОпубликовано 1.10.2008 в Статьи
Когда я подыскивал себе 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”. Конечно, эта книга не бесплатна, но, для человека, умеющего пользоваться Гуглом – это не проблема
Понравилась статья? Подпишись на обновления по RSS/E-mail

(29 голосов, средний: 4.59 из 5)
По файлу на контроллер? Шаблонный код? Фу-фу, я слышу запах Джавы.
Спасибо за статью. Есть несколько вопросов.
Зачем делегировать запрос в V? Также было упомянуто что работой с БД занимается C. Зачем тогда вообще модель в такой системе? Если это считается извращением, то что оно вообще делает в библиотеке?
Мне понятно желание схлопнуть разные компоненты, но непонятно зачем тогда изначально брать MVC? Есть ли у вас пример когда одна и та же модель использовалась с разными V и C?
Еще интересна история фреймворка: кому, когда и по какой причине захотелось для веб-разработки на Перле использовать MVC? Кроме веба он способен на что-то еще?
ORM лежит слоем ниже модели или используется как mixin? Упомянута работа с БД из контроллера. Как в таком случае читает данные модель? Или они читаются только при инициализации?
Заранее спасибо за ответы.
Думаю, это просто такая потенциальная возможность.
У каждого ведь свои подходы к написанию.
Нет, с БД (или другим источником информации) работает M.
C лишь принимает запрос, что и из какой M взять и какому V это скормить.
Результат работы V отправляется клиенту. Вроде так.
IIRC, MFC тоже сделан по этой моделе. Еще Java Swing.
GUI framework-и часто по такой моделе делаются.
В принципе, MVC — это pattern, по-этому можно использовать где угодно.
ORM — тоже pattern. Почитайте о этом всем на WP. Моделью может быть
модуль с двумя функциями: прочитать число из файла, инкрементировать его,
записать обратно и вернуть контроллеру; а вторая тоже самое,
только декрементировать. И это будет модель, да. А ORM — это
один из методов абстракции поверх БД (а может и данных вообще).
Максим, я надеялся что по вопросам ясно что я знаю что такое MVC, а вопросы относятся к реализации и рекомендуемых подходах в Catalyst.
Спасибо за ответы, но зря трудились.
Насчет:
Так должно бы быть, но автор написал:
Сергей, видать вопросы были слишком базовые.
Ничего страшного — кому-то другому пригодятся, типа FAQ (;
Да и писал я спросонья (=
Тогда…
Ну, можно писать GUI с wxWidgets.
Может и базовые, подожду ответы.
Сайты на Catalyst:
http://catalystsites.org/,
http://dev.catalyst.perl.org/wiki/SitesRunningCatalyst
Нет, нет. Возможно, я где-то неоднозначно выразился, но я абсолютно не имел ввиду что Контроллер работает непосредственно с БД. Нет. Для работы с источниками данных контроллер использует Модель.
Ответы на вопросы я дам после блока исходников.
Вот пример одного Действия Контроллера, которое выполняет валидацию данных и сохраняет их посредствам Модели в БД.
Модель выглядит так:
Класс BoostedTest::RDBO::Testplan содержит сгенерированную автоматически структуру таблицы, с информацией о типах полях и связях между таблицами. Пользовательские методы для работы с БД (получение 3-х последних записей и т.д. ) можно дописывать в Модель.
Теперь конкретно по вопросам:
И
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’а. В примере, в шаблон был передан итератор. Вот пример его использования в шаблоне:
Модели используются для того чтобы адаптировать источник данных (в данном случае ORM ) для удобной работы с Catalyst. ORM лежит слоем ниже.
Я думаю, что Perl ничем не уступает ни Python, ни PHP, ни Ruby. Просто Перл немного сложнее в изучении. В Catalyst, к примеру, очень много чего похожего из Rails (это все таки Опен Сорс, и хорошие идеи необходимо реализовывать). Так если на Rail можно создавать красивые веб-сайты, то почему бы не делать этого на Catalyst?
Кроме того, у Perl намного больше различных модулей для работы с источниками данных, парсинга текста и много-много другого. И… Perl просто работает быстрее Ruby.
Вот, могу посоветовать почитать следующею очень интересную заметку:
Catalyst: Perl’s answer to Ruby on Rails and AJAX
P.S: советую посмотреть еще один сайт, разработанный на Catalyst:
http://godcore.org.ua/
Понял, спасибо.
2 Всеволод Соловьёв
А я считаю такой подход очень удобным. По крайней мере такой подход сейчас очень популярен. Но, если очень и очень хочется – то можно держать и много контроллеров в одном файле. Есть там такой корневой контроллер Root.pm, который создается для каждого проекта Catalyst, действия которого вызываются прежде действий других контроллеров. Это нужно, например, для собственной обработки HTTP-ошибок, как то 404-я или 500-я, но, можно и перехватывать вызовы других контроллеров и обрабатывать их по-своему. С другой стороны, можно кастумезировать обработчик запросов Catalyst::Dispatcher, и создать свой, локальный… но это уже немного усложнит код проекта
Подскажите экзампл, с которого можно начать написание веб-проекта, например по типу форума?
Не поленитесь вытянуть исходники Catalyst из svn-репозитория:
там есть очень полезные примеры простых приложений, включая небольшой форум.
Есть проект форума. Foorum называется. Живое демо можно посмотреть тут.
Могу посоветовать еще движок блога на Catalyst. Там есть хорошие примеры использования Rose::DB::Object.
====
И, пользуясь случаем, вот еще один пример проекта на Catalyst:
Сервис по поиску соседей по квартире http://delim.com.ua/
Изображение Какталистовой молекулы в (http://delim.com.ua/favicon.ico) выдает то, какую технологию применили создатели сайта. Вспомнил о проекте, потому что когда-то читал заметку на Хабре.
Доклад (видео) Романа Беликина по теме: MVC + Catalyst можно посмотреть на YAPC::TV – http://yapc.tv/2008/fe/roman-catalyst
Может кто подскажет - есть ли русская документция к этому чудному фреймворку? Или к примеру исходники какого нибудь приложения с русскими коментариями.
С русскоязычной докой увы… не сложилось
Можете поискать книгу, которая была рекомендована в заметке, с ее помощью можно научится работать с Каталистом без особых знаний английского: очень интересно, просто и понятно написана.
А существуют ли какие-то места для общения русскоязычных разработчиков на Catalyst’e?
Ну, есть сообщество: http://community.livejournal.com/ru_catalyst/ но, оно довольно слабое.
Я обычно ищу информацию на англоязычных ресурсах.
Да это сообщество я и создавал. Вот только критической массы участников оно не смогло набрать.
А больше общаться негде… Пока читаю официальные англоязычные списки рассылки - и собственно всё.
делаю как в книге, только использую DBI вместе DBIx::Class
use 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 rules
__PACKAGE__->deny_access_unless(’/admin’, [qw/admin/]);
ругатеся:
perl script/myapp_server.pl
Can’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??
на что именнно он ругается скажите пожалуйста?
ЗЫ: каталист с певрого раза не очень понравился, так как все равно всё надо переделывать под свои нужны и телепатировать с разработчиками
>> 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?Rose::DB::Object::Tutorial
FormFu:
http://search.cpan.org/perldoc?HTML::FormFu
Увесистый, но очень удобный.
Дмитрий Жарий, кстате, ну такое как каталист можно написать на много “ярче” с использованием магии, функции tie
короче, так какие вы приемущиства увидели от catalyst? я не нашел пока
>> ну такое как каталист можно написать на много “ярче” с использованием магии, функции tie
>> короче, так какие вы приемущиства увидели от catalyst? я не нашел пока
Хм… а что значит «ярче», в вашем понимании этого слова? Преимуществ Каталиста по сравнению с чем? Не совсем понимаю, поэтому отвечу, основываясь на собственных предположениях.
Да. Каталист это не простой скриптик, в теле которого обрабатываются данные и запросы к базе данных, реализуется так называемая «бизнес-логика», которая и реализует ту цель, ради которой и задумывалось создания скрипта, и создает HTML отчет. При этом HTML теги мешаются с кодом бизнес-логики и и запросами к БД.
Я не говорю, что все такие скрипты плохие. Нет, они могут достаточно легко поддерживаться и эффективно решать поставленную задачу. Такие скрипты не плохие, пока не начинают разрастаться. В конце концов, они могут превратится в мешанину из HTML, SQL и Perl.
И я не с неба беру эти слова. Я опираюсь на собственный опыт.
Если сравнивать Catalyst с другими существующими Перловыми фреймворками, то все остальные либо слишком молоды ( Mojo ), либо слишком мертвы ( Maypole ), либо недостаточно эффективны для решения моих задач ( CGI::Application ). Кстати, можете посмотреть перечисленных фреймворки, возможно какой-нибудь вам подойдет.
Как веб фреймворк, Каталист мне нравится тем, что у него есть довольно активное сообщество. Новые модули для Каталиста обновляются довольно часто, и в принципе, на CPAN можно найти довольно много готовых решений. Я не трачу время на разработку собственных велосипедов. Некоторое время уходит, на то, чтобы разобраться с интересующим меня модулем, но оно в разы меньше, чем если бы я писал что-то с нуля.
Каталист дает свободу. Само ядро каталиста (то, что Catalyst-Runtime ) содержит минимум библиотечного кода, который не навязывает вам чем нужно пользоваться для работы с БД или рендерить HTML/XLS/PDF. Каталист – это каркас. Удобный объектно-ориентированый каркас для вашего приложения. А то, как я буду работать с данными и какие модули использовать – это уже на мое усмотрение. Мне нравится такая свобода.
Я не говорю, что Каталист сверх легкий для изучения фреймворк, и то что он сверх качественно и понятно документирован. Нет. Нужно разбираться, читать мануалы и рыться в исходном коде.
Но, оно того стоит. По крайней мере, я в этом уверен.
>Хм… а что значит «ярче», в вашем понимании этого слова? Преимуществ Каталиста по сравнению с чем? Не совсем понимаю, поэтому отвечу, >основываясь на собственных предположениях.
сделать функции, точнее методы и их мощностями ООП, tie и анонимными массивами “раскрутить” и всё…
кстате, вопрос по поводу каталиста:
какой контроллер отвичает за страницу loalhost:3000 (без loalhost:3000/list) не могу найти
Вот как раз то, что Catalyst даёт свободу и является одновременно его сильной и слабой сторонами.
Многим разработчикам хотелось бы для каждой проблемы видеть простое и единственное решение.
>> какой контроллер отвичает за страницу loalhost:3000 (без loalhost:3000/list) не могу найтиC
MyApp::Controller::Root и экшен index
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.
Надежный и мощный союз для создания веб приложения. Все эти модули интегрируются с Каталистом.
На самом деле решений для Каталиста много, но самые лучшие, на мой взгляд, перечислены выше.
подскажите пожалуйста, я не могу вывести имя пользователя который зарегистрирован и активен!
использую 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’ => ‘t01@na.com’, ‘password’ =>
‘e727d1464ae12436e899a726da5b2f11d8381b26′, ‘active’ => ‘1′, ‘id’ => ‘1′, ‘last_name’ => ‘Blow’, ‘first_name’ => ‘Joe’, ‘username’ => ‘test01′ } },
‘Catalyst::Authentication::Store::DBI::User’ ); .
не получается разымновать и вывести имя пользователя, аномалия!!
Попробуйте так:
$c->user->get->{username}
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.”
вот исходники, что делать не знаю
пробовал многое, тоже самое…
sub user {my $c = shift;
if (@_) {
return $c->_user(@_);
}
if ( defined($c->_user) ) {
return $c->_user;
} else {
return $c->auth_restore_user;
}
}
$c->user->{user}->{username}работает
есть модуль DBIx::Tree
при выполнении в контролере он выполняется один раз, то есть если обновить страницу, то ничего нету, просто страница без дерева…
модели или плагина нету, я использовал use DBIx::Tree;
тестовая страница без catalyst’а работает нормально с этом модулем…
в чем проблема что он выполняется один раз? нужно сделать модель (или плагин) или mod_perl использовать?
(я mod_perl никогда не использовал, сейчас проблематично поставить…)
(и кстате, catalyst не рекомендуется запускать почему-то в режиме CGI, perl он быстро работает и в CGI)
Не могу сказать точно, почему дерево создается только один раз.
Возможно, вы используете глобальные переменные для хранения экземпляра объекта DBIx::Tree.
Возможно, это баг самого модуля.
В любом случае, да, из DBIx::Tree нужно сделать отдельную модель. Рекомендую воспользоваться Catalyst::Model::Adaptor.
Попробуйте сделать модель, и возможно, проблема решится сама собой
На счет mod_perl’a и FCGI, посмотрите на indigoPerl или XAMPP, там уже предустановленны и сконфигурированы такие вещи как mod_perl, FastCGI, SSL и еще много чего полезного..
1) как сделать чтобы часть кода была во всех методах сразу при вызове?
в других метода ошибка от use strict что $dbh не инициализирован….
2) как уничтожыть соединение от бызы во всех методах $dbh->disconnect();
навернео не правильно
в документации написано нормально, но примеров реальных я не видел… так что надо телепатировать…
где можно найти большой проект и посмотреть как это все делается?
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/angerwhale/tree/master
Прямо на Гитхабе можно поискать проекты на Каталисте.
Вот еще сайт. Там можно загрузить его исходники (внизу)
http://godcore.org.ua/
и блог:
http://vti.godcore.org.ua/
Вот еще проект:
http://handelframework.com/blog/
Вот его исходники:
http://github.com/claco/handel/tree/master
Вот про Git
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/angerwhale/tree/master
Прямо на Гитхабе можно поискать проекты на Каталисте.
Вот еще сайт. Там можно загрузить его исходники (внизу)
http://godcore.org.ua/
и блог:
http://vti.godcore.org.ua/
Вот еще проект:
http://handelframework.com/blog/
Вот его исходники:
http://github.com/claco/handel/tree/master
Вот про Git
sub end : Private {
my ($self, $c) = @_;
$c->forward(’MyApp::View::HTML::Template’);
my $dbh = $c->model(’DBI’)->dbh;
$dbh->disconnect();
}
данный код не работает, точнее через один раз идет вывод что примерно: “Server gone”
может быть как-то можно переблагословить объект? и там вырубить?:
__PACKAGE__->deny_access_unless(
“/add1″,
[qw/admin/],
);
__PACKAGE__->deny_access_unless(
“/add2″,
[qw/admin/],
);
запускается, но почему данный код админа не пускает?
он пишет что доступ запрещен, то есть всем запрещает доступ
я хотел разрешить вход в 2 раздела только админу, все остальное всем разрешить…
Я какую-то фигню в 36-м комментарии сказал.
Хотел показать, что нужно «все глобальное» передавать через stash, а сам допустил грубую ошибку.
Если у вас есть класс обвертка над DBI, то используйте его функции.
Catalyst::Model::DBI есть метод disconnect. Поэтому нужно использовать его.
Кроме того, в деструкторе Catalyst::Model::DBI есть disconnect! Так что он по любому выполнится при завершении работы приложения.
Кроме того, $dbh лучше не сохранять в stash. Дело в том, что в случае
Catalyst::Model::DBI при вызове метода dbh выполняется некоторый полезный код, который при разрыве соединения с БД пытается его восстановить:
package Catalyst::Model::DBI;# … { … Skip ... }
=item $self->dbh
Returns the current database handle.
=cut
sub dbh {
return shift->stay_connected;
}
Так что будьте осторожны с сохранением значения $dbh.
Что же касается вопроса по поводу ACL, то ответить не могу, так как в данном случае необходим исходный код приложения.
> Так что он по любому выполнится при завершении работы приложения.
спасибо, буду знать, в обычный CGI он не срабатывает наверное
>Так что будьте осторожны с сохранением значения $dbh.
хорошо посмотрю
почему “осторожны”, нельзя через stash?
страница когда загрузилсь, то соединение выключилось, если пользователь обновил, то соединение опять пошло и включилось…
> Что же касается вопроса по поводу ACL, то ответить не могу, так как в данном случае необходим исходный код приложения.
какой именно код? исходники модуля или там где конфиг ACL?
обидная проблема, я не решил ее, не знаю
я сделал так так как в документации ничего не добавлял…
извените, понял, там можно просто даже и не подключатся…
my $sth = $c->model(’DBI’)->dbh->prepare(”SELECT ….”); $sth->finish();
еще подключение можно было бы добавить в конструктор Catalyst::Model::DBI
на счет ACL попробую еще некоторый варианты, может оно конфликтует когда вместе с “mysql rose” писать уровни доступа в конфиг…
я пробовал все что угодно, но он не пускает никого
я хотел разрешить вход в 2 раздела только админу, все остальное всем разрешить…
подскажите кто как делал, пожалуйста…
возможно тут надо под другому как-то?
А что это за /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 |
'————————————-+————————————–'
Сразу скажу, что в правилах ACL нужно указывать значение из колонки “Private”.
Т.е. если у меня есть /add1, то в ACL нужно указать /admin/add1
Я это написол просто пример
смотрю по Private
[debug] Loaded Path actions:
.————————————-+————————————–.
| Path | Private |
+————————————-+————————————–+
| / | /default |
| / | /index |
| /login | /login/login |
| /logout | /logout/logout |
| /view | /view/add |
| /view | /view/add1 |
‘————————————-+————————————–’
кстате, перед тем тем как использовать rose (добавлять записи для возможности просмотра/выполнения контроллеров), нужно сначало запретить просмотр всем у кого нету записай в таблицы? или оно само срабатывает? просто оно “забивает” на эти доступы по-моиму….
Так, хорошо, тогда скиньте еще ваши
ACL правила. У меня такое предчувствие, что одно попросту перекрывает другое.
Попробуйте создать похожую структуру вашего приложения с вашими ACL правилами вот в этой пустышке:
demo-0.01.tar.gz
(поправьте demo_server.pl(путь к перлу) и установите необходимые модули )
Если оно будет работать там, то значит проблема может быть скрыта где-то в плагине аутотентификации. Если же оно по прежнему не будет работать как надо – то проблема в ACL правилах, и их нужно будет переделать.
Что же касается вопроса по Rose::DB::Object – то это просто Маппер (ORM), который работает вне Каталиста, и соответственно просто “забивает” на эти доступы, если, конечно, вы сами не допишете нужный код.
Зато очень помогает если много таблиц и отношений (relations) между этими таблицами.
Если вы решитесь его использовать, то советую прочитать весь Rose::DB::Object::Tutorial перед началом серьезной работы с ним, это поможет избежать нескольких граблей. В целом, работа с ним намного приятней и проще чем с DBI.
> Так, хорошо, тогда скиньте еще ваши ACL правила.
какие праивила? у меня правил нету в файле нту…я вставил в таблицу одно значение что-бы разрешить доступ…
я пробовал поставить те два которые я тут показал…
спасибо, но я так и не понял, сначало нужно заперить всем просмативать/выполнять котроллеры? перед тем как разрешать через MySQL?
или кто запрещает? перед тем как разрешать?
в документации это не нашел - довольно странно…
или я перепутал что-то?
или по короче сначала
я хотел разрешить вход в 2 раздела только админу, все остальное всем разрешить… не получилось
__PACKAGE__->deny_access_unless(
“/add1″,
[qw/admin/],
);
__PACKAGE__->deny_access_unless(
“/add2″,
[qw/admin/],
);
Дмитрий Жарий, Ваша демо программа работает, запрещает заходить туда куда не надо, спасибо
у меня есть такой модуль я его настроил
http://search.cpan.org/~janus/Catalyst-Authentication-Store-DBI-0.01/lib/Catalyst/Authentication/Store/DBI.pm
не пускает, я эту схемотехнику понять не могу… как можно проверить работает ли этот модуль Catalyst::Authentication::Store::DBI ?
фух, я кажется разобрался! спасибо!
просто очень много информации не понятно куда бежать и куда смотреть!!
кто использовал mod_perl подскажите что надо сделать…
везде написано по разному
1) в книге котораю тут советовали написано пол страницы - ничего не заработало поствил Catalyst::Engine::Apache
2) тут написано одно http://phpsuxx.blogspot.com/2008/01/mvc-catalyst-apache2-modperl.html
3) тут еще другое http://search.cpan.org/~agrundma/Catalyst-Engine-Apache-1.07/lib/Catalyst/Engine/Apache2/MP20.pm
4) а тут через скрипт http://catalyst.infogami.com/cookbook/mod_perl
фиг поймешь что надо делать…
apache2.2.9
mod_perlmod_perl2-2.0.4,3
модули в папке lib нужно подгрузть для mod_perl - это понятно…
но а что делать для самого каталиста?
нужно ли использовать скрипты в какталоге script?
вообщем вот мойт конфиг после переработки, но точный конфиг в гугле я не нашел… точнее нашел, но он не заработа вывел мне “0″
сейчас 403 ошибка
=============================================================
PerlSwitches -I/home/x0/data/www/MyApp/lib
DocumentRoot /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
кто знает скажите что сделать?
конфиг не получилось получилось сюда опубликовать
подскажите пожалуйста конфиг
вообщем нифига не поулчилось я пробовал с fast-cgi по разному выдает разные ошибки…
и везде по разному написано и я не знаю праильно… и ошибки выдаються довольно странные
вообще-то авторы которые писали инструкии к настройки веб сервера для каталиста должны были расмотреть варианты, я напрмиер не знаю надо ли мне использовать скрипты в каталоге script…
настраивать теперь - это с пушки по воробьям…
тут описан http://search.cpan.org/~mramberg/Catalyst-Runtime-5.71000/lib/Catalyst/Engine/FastCGI.pm два режима статический и динамический… в динамическом скрипты из каталога script не используются, ошибки веб сервер сегда выдает 403…
в логах часто такое
[Sun Mar 01 11:13:43 2009] [error] [client .81.18] client denied by server configuration: /home/x0/data/www/MyApp/root/
сделал, я сейчас зарегистрируюсь и напишу как получилось…
тут гостям запрещено писать код…
Пишите код так:
В своих целях, я использую Apache 1.3.41, под который я успешно настроил FastCGI, и запуск Каталист-приложений, по переведенному Вами мануалу на CPAN. Со вторым Апачем у меня действительно были проблемы, правда немного другого характера, чем описанные вами и мне пришлось от него пока отказаться.
подскажите пожалуйста как сделат ьчтобы при изменении кода в модулях ко применялся в прогармме, чтобы не перегружат ьвсе время веб сервер
при mod_perl и CGI всегда нужно перегружать веб сервер, как сделат ьчтобы не перегружать его все время?
и в FastCGI тоже надо перегружать чтобы код стал активный?
Для этого нужно пользоваться development веб-сервером, который лежит у вас в script/%app%_server.pl. Его нужно запустить с ключем -r.
Тогда он будет перегружаться после изменений кода.
поджскажите у меня планируется сделать контроллеров штук до 100
можно ли каталоги сделать иеархичные?
/lib/controler/lib0/
/lib/controler/lib1/
/lib/controler/lib2/
1O_O контроллеров? Круто
Да, конечно можно их сделать иерархичными, по типу MyApp::Controller::Blog::Add, MyApp::Controller::Blog::Edit и т.д. без проблем.
Можно даже немного похачить Каталист, чтобы у вас было несколько папок «Controller». Я писал про это вот тут:
Но, ни разу не применял, так как посчитал что это слишком грязный хак
> 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
?
Немного подправлю:
/lib/YourAppName/Controller/Blog/Edit.pm
То контроллер будет называться YourAppName::Controller::Blog::Edit
И будет автоматически подхвачен и инициализирован Каталистом.
Подскажите, есть ли открытые проекты на Catalyst типа osCommerce или ZenCart? Кто пытался уже строить приложения эл. коммерции с большой поссещаемость?
С открытым исходным кодом есть такой проект:
http://handelframework.com/
подскжаите пожалуйста, зачем писать use base qw(Catalyst::Model); ?
что мы с него вызываем?
я пытаюсь сейчас сделать модель… нашел примеры, но примеры везде разные… делаю…
подскажите зачем в некоторых методах ставиться два знака подчеркивания?
я это видел только в Катализаторе, больше нигде
sub __setup {
}
1) >> зачем писать use base qw(Catalyst::Model); ?
Так сложилось, что Catalyst::Controller и Catalyst::View содержат дополнительные методы, по сравнению с Catalyst::Component. Catalyst::Model их не содержит. Т.е., по сути это тот же самый Catalyst::Component, но в будущем, набор методов базового класса Catalyst::Model может быть расширен. Именно по этому лучше наследоваться от Catalyst::Model.
2) >> подскажите зачем в некоторых методах ставиться два знака подчеркивания?
Все зависит от конкретного автора кода. Скорее всего, это просто такой стиль кодирования. Но, в любом случае, если перед именем метода стоит либо один, либо два знака подчеркивания, это означает, что такой метод является внутренним (приватным) для класса и его не следует вызывать извне.
часто пишет в режиме 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.”
А какое отношение имеет 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, НЕ Catalyst
max_connections=50
попробую поставить больше, я не запускаю скрипт, просто запустил script/%app%_cgi.pl
через 5 -10 пробую включить мне говорит сервер гон
этот скрипт - зто веб сервер правильно? он запускает ускает каталист в CGI
Увадаемый, Дмитрий Жарий, спасибо, что написали статью!!
я вот хотел еще спросить, не знаю где можно спросить
(кстате, а нет ли где-то форумов чтобы там спросить? ну формы чтобы зарегится и спросить
По каталисту многия документация к ему модулям идет без примеров… а исходники не читаемые и без комментарием, тоже
===================================
нашел модуль Catalyst::Controller::FormBuilder http://search.cpan.org/~jcamacho/Catalyst-Controller-FormBuilder-0.04/lib/Catalyst/Controller/FormBuilder.pm ,
решил сделать свой аналогичный, мне он не понравился тем что там надо тэги другие вставлять, и не опнял на счет фильтрации что делать
1) но я не опнял зачем там используется
Catalyst::Controller
http://cpansearch.perl.org/src/JCAMACHO/Catalyst-Controller-FormBuilder-0.04/lib/Catalyst/Controller/FormBuilder.pm
и методы с него
sub create_action {
my $self = shift;
my %args = @_;
my $attr_name = $self->_fb_setup->{attr_name};
if ( exists $args{attributes}{$attr_name} ) {
$args{_attr_params} = delete $args{attributes}{$attr_name};
if ( my $source_type = $self->_fb_setup->{source_type} ) {
$args{_source_type} = $source_type;
}
push @{ $args{attributes}{ActionClass} }, $self->_fb_setup->{action};
}
$self->SUPER::create_action(%args);
}
2) в Catalyst::Action
если я правильно понял сделан для того чтобы “прицепить” к объекту $c методы (только не понятно зачем)
http://x0.org.ua/perl/Action.pm
sub execute {
my $self = shift;
my ( $controller, $c ) = @_;
return $self->NEXT::execute(@_)
unless exists $self->attributes->{ActionClass}
&& $self->attributes->{ActionClass}[0] eq
$controller->_fb_setup->{action};
my $form = $self->_setup_form(@_);
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;
……………………………………….
в книге в которую вы привел ив стаье написано про модели, но про контроллеры ничего не написано…
>> но я не опнял зачем там используется 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?Catalyst::Plugin::Form::Processor
Я сейчас остановился на HTML::FormFu – из тяжеловесов по обработке форм, считаю его лучшим: http://search.cpan.org/perldoc?Catalyst::Controller::HTML::FormFu
спасибо не видел Catalyst::Plugin::Form::Processor, интересный!
но FormBuilder и FormFu не поравились
в FormBuilder надо делать текстоый файл с указанием какие данные из форм передаються, это не проблема
но когда я хочю добавить какие-то регулярное выражение, удалить пробелы и т.д.
есть ли они в FormBuilder? или я не понял? я посмотрел исходники не увидел
если я хочю добавить некоторые другие проверки, например
1) проверка валидности пароля
2) text tidy
3) etс
то как мне эти регулярные выражения (проверки) вставить в FormBuilder чтобы не ковырять исходники?
вот пример я еще не закончил, но оно функционирует:
(то там добавить можно другие проверки и SQL::Abstract (DBIx::Class, etc) прямо туда, хотя не знаю)
http://x0.org.ua/perl/ExtraDBI.pm
(извините, без комментариев и не отформатированно)
кстате. я статю вот хочу написать про каталист
извините, а зачем сделаныланы эти модули CRUD которые нету в этой стаье, а например:
http://search.cpan.org/~mramberg/Catalyst-Model-CDBI-CRUD-0.04/CRUD.pm
http://search.cpan.org/~karman/CatalystX-CRUD-0.43/lib/CatalystX/CRUD.pm
там документации нету, или это просто вспомогательные какие-то?
Это вспомогательные модули. И документация есть, вот например:
http://search.cpan.org/perldoc?CatalystX::CRUD::Tutorial
По идее, эти CRUD’ы экономят строки кода, но зато они ограничивают программиста в выборе средств валидации формы и работы с БД.
я вот нашел как поставитьвить на хостинг
только не понял что-то не много, навреное еще есть какие варианты установки
на хостинге может компилятор не стоять
Install MVC Catalist to hosting
# cpan PAR
# cpan PAR::Packer
http://search.cpan.org/~smueller/PAR-Packer-0.991/lib/PAR/Packer.pm
http://search.cpan.org/~smueller/PAR-0.992/lib/PAR.pm
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 warned
use 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 formats
catalyst;
install_script glob(’script/*.pl’);
auto_install;
catalyst_par();
WriteAll;
# perl Makefile.PL
# make catalyst_par
my_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.php?topic=2392
Options +FollowSymLinks +ExecCGIRewriteEngine On
RewriteCond %{REQUEST_URI} !^/?cgi-bin/myapp/script/myapp_cgi.pl
RewriteRule ^(.*)$ cgi-bin/myapp/script/cgi.pl/$1 [PT,L]
Я как-то писал у себя в блоге про установку на хостинг, может поможет:
Catalyst и shared хостинг под FreeBSD
Смысл в том, что нужно собрать все на такой же ОС, и при помощи PAR перенести скомпилированные модули на сервер в локальную lib приложения. У меня под FreeBSD так получилось. Доступ у меня был только по http://FTP.
Ув. Дмитрий Жарий вы где-то писали что использовали каталист в FastCGI в первом апаче
можно узнать зачем? это на хостинге было?
у меня в CGI и FastCGI жрет 50 метров на один процесс и процессор сильно грузит
в Mod_perl такого нету, показалось что нормально
ну вот у знакомого стоит на сервер фастСЦИ… почему каталист ест 50 метров памяти и грузиться 5-15 сек. так должно быть?
может что-то в настрйоках? я вот так настроил, по другом не получилсоь
тут написано не много другие варианты http://search.cpan.org/~mramberg/Catalyst-Runtime-5.80005/lib/Catalyst/Engine/FastCGI.pm#Apache_1.x,_2.x
кто натраивал FastCGI может что-то добавить?
Options +FollowSymLinks +ExecCGI
AddHandler fastcgi-script .pl
<Files myapp_fastcgi.pl>
SetHandler fastcgi-script
</Files>
#Options +FollowSymLinks +ExecCGI
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_URI} !^/?script/myapp_fastcgi.pl
RewriteRule ^(.*)$ script/myapp_fastcgi.pl/$1 [PT,L]
апаче:
FastCgiConfig -singleThreshold 2 -minProcesses 1 -maxProcesses 5 -autoUpdate \
-idle-timeout 170 -killInterval 8 \
-pass-header HTTP_AUTHORIZATION \
некоторые вещи не доделал, в исходники в окончательный вариант еще не фофрмлил
страницы еще не все работают
посмотрите есть ли ошибки:
(perltidy)
http://x0.org.ua/perl/cat/
еще демо:
http://ldap.x0.org.ua
(*HTML не оформлял)
Админ:
логин: test01
mypass
юзер
логин: test02
mypass