Статьи

Решения Catalyst

Следуя различным текстовым потокам на Catalyst ([ 1 ], [ 2 ], [ 3 ], [ 4 ]), следующая проблема — выбор плагинов Cataylst.

Лично знаком с Perl по работе с клеевым слоем в командной строке, так что различные веб-интерфейсы API — это почти неизвестная территория. Более того, блаженно передавая SQL через DBI (возможно, ближе всего к DBI в PHP является PDO, хотя PEAR DB вдохновлялся этим, я полагаю), но Catalyst предоставит вам больше выбора, чем просто DBI.

В любом случае — первый шаг — посмотреть, что доступно, что, пожалуй, проще всего сделать здесь — многие из перечисленных там пакетов предлагают уникальные дополнительные функции, но другие предлагают конкурирующие альтернативы. Практически во всех случаях это оболочки для других библиотек в CPAN, упаковывающие их в форму, удобную для использования с Catalyst. Два ключевых варианта, по крайней мере, для начала, предназначены для «Model» и «View», поэтому необходимо исследовать различные Catalyst::Model::* и Catalyst::View::* .

Начнем с последнего, что использовать для View, мы говорим о шаблонизаторах. Документация Catalyst, кажется, предполагает, что Template Toolkit (TT) является основным выбором, и если вы установили Bundle::Catalyst из CPAN, это уже будет включать TT вместе с оберткой Catalyst::View::TT . Template Toolkit был (по-видимому, так и есть) источником вдохновения для Smarty, и основной принцип тот же — императивный синтаксис (если / еще / и т.д.), встроенный в HTML. Хотя это не мой предпочтительный способ создания шаблонов (плагин WACT и все, что вам когда-либо нужно знать о шаблонах — см. Здесь ), и хотя есть плагин Catalyst для PHP :: Interpreter , я полностью согласен с очевидным / стабильным выбором Прямо сейчас, плюс кривая обучения ТТ, от базовых экспериментов, довольно поверхностная. Это не значит, что ТТ — единственный здравомыслящий выбор — еще одно очевидное имя, которое я слышал о Мейсоне, которое используется Amazon и del.icio.us, помимо прочего, но у него есть интуитивное чувство, что есть намного более острая кривая обучения. Открыто для предложения здесь, хотя.

Что касается модели, в основном это выбор между двумя уровнями реляционного отображения объектов в CPAN — Class :: DBI и DBIx (или просто обычным SQL через DBI, для которого, я полагаю, плагин не нужен). Чтение вокруг DBIx кажется «гудением», но обратите внимание на «ЭКСПЕРИМЕНТАЛЬНОЕ» предупреждение. На данный момент у меня нет четкого мнения — учитывая, что я планирую только несколько таблиц, склоняясь к старомодному SQL + DBI.

Чтобы узнать больше, поиграйтесь с Catalyst::Plugin::CDBI::Sweet — вот вам «Hello World» для интереса;

Предполагая Ubuntu с этого момента, если вы установили Bundle::Catalyst вам нужно будет добавить еще несколько битов и кусочков и выполнить несколько команд;

 $ sudo apt-get install sqlite3
 $ cd
 $ sqlite3 example.db
 sqlite> CREATE TABLE user (имя VARCHAR (15) PRIMARY KEY);
 sqlite> .quit
 оболочка $ sudo perl -MCPAN -e
 cpan> установить DBD :: SQLite
 cpan> установить класс :: DBI :: SQLite
 cpan> установить Catalyst :: Model :: CDBI
 cpan> установить Catalyst :: Model :: CDBI :: Sweet
 Пример $ catalyst.pl
 Пример $ cd
 $ ./script/example_create.pl модель CDBI пользователя dbi: SQLite: /home/harryf/example.db <<вставить правильный путь

Это создаст базу данных с одной таблицей (называемой пользователем, содержащей один столбец «имя») и скелетным приложением Catalyst.

Теперь в ~Example/lib/Example/Model создан файл CDBI.pm содержащий;

package Example::Model::CDBI; use base 'Catalyst::Model::CDBI::Sweet'; Example::Model::CDBI->connection('dbi:SQLite:/home/harryf/example.db');
package Example::Model::CDBI; use base 'Catalyst::Model::CDBI::Sweet'; Example::Model::CDBI->connection('dbi:SQLite:/home/harryf/example.db'); 

Это базовый класс для расширения других классов Model, который устанавливает соединение с базой данных, а также наследуется от Catalyst::Model::CDBI::Sweet который, в свою очередь, наследует от Class::DBI::Sweet , который наследует снова из Class::DBI . Самый быстрый способ получить документацию по API для этих классов — это использовать командную строку, например, $ man Class::DBI , а не заниматься серфингом.

Чтобы предоставить модель для моей таблицы, поместите следующее в ~Example/lib/Example/Model/User.pm

package User::Model::Tag; use strict; use base 'Example::Model::CDBI'; __PACKAGE__->table('user'); __PACKAGE__->columns( Primary => qw[ name ] );
package User::Model::Tag; use strict; use base 'Example::Model::CDBI'; __PACKAGE__->table('user'); __PACKAGE__->columns( Primary => qw[ name ] ); 

Вот и все — это наследуется от более раннего класса, собирая все до Class::DBI так что есть много методов под рукой. Чтобы вставить некоторые записи в таблицу, создан скрипт ~Example/lib/insert.pl содержащий;

#!/usr/bin/perl -w use strict; use Example::Model::User; my @names = qw(Joe Mary John Mike); foreach my $name ( @names ) { my $user = Example::Model::User->create({'name'=>$name}); print "Inserting $namen"; }
#!/usr/bin/perl -w use strict; use Example::Model::User; my @names = qw(Joe Mary John Mike); foreach my $name ( @names ) { my $user = Example::Model::User->create({'name'=>$name}); print "Inserting $namen"; } 

Теперь это можно запустить как;

 $ chmod + x insert.pl
 $ ./insert.pl

Чтобы ВЫБРАТЬ вставленные строки снова, следующий скрипт в ~Example/lib/select.pl делает работу;

#!/usr/bin/perl -w use strict; use Example::Model::User; my $userClass = Example::Model::User->new(); my $iterator = $userClass->retrieve_all; while ( my $user = $iterator->next ) { print $user->{name}."n"; }
#!/usr/bin/perl -w use strict; use Example::Model::User; my $userClass = Example::Model::User->new(); my $iterator = $userClass->retrieve_all; while ( my $user = $iterator->next ) { print $user->{name}."n"; } 

По крайней мере, с Class::DBI это довольно просто, но от реальных случаев использования до этого далеко.

Глядя на ORM, вы снова попадаете на еще одну небольшую загадку / WACT. Удивительно, что Джефф, кажется, единственный человек, который задумал создать слой упрощения базы данных (мой собственный термин) — использует обычный SQL, он легок и делает безумно простым получение данных для общих проблем, связанных с сетью . Например, нужен ли индексированный массив из БД для заполнения тега select? Как насчет этого одного лайнера;

$countries = DBC::getOneColumnAsArray('SELECT name FROM countries');
$countries = DBC::getOneColumnAsArray('SELECT name FROM countries'); 

Это позаботилось о создании соединения (при необходимости), выполнении запроса, циклическом просмотре результатов и возврате индексированного массива. Но эй, это просто фреймворк PHP Джеймс 😉