Следуя различным текстовым потокам на 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 Джеймс 😉