Catalyst: Web-Framework für Perl

Erste Schritte

Der Server ist immer an Bord

Am Anfang stand catalyst.pl iXApp. Dieser Befehl generierte die komplette Verzeichnisstruktur und alle Dateien (soweit nicht anders erwähnt) der Beispielanwendung. Jede so erstellte Applikation kommt mit einem Entwicklungsserver, den script/ixapp_server.pl im Anwendungsverzeichnis startet. Er ist unter http://localhost:3000 erreichbar. Wichtige Serveroptionen sind --restart zum automatischen Neustart bei Änderungen an Modulen oder der Konfiguration und --debug, das ausführliche Server- und Request-Informationen ausgibt.

Weitere wichtige Dateien sind die globale Konfigurationsdatei ixapp.yml und das Applikationsmodul lib/iXApp.pm, das Plug-ins lädt und globale Erweiterungen der Catalyst-Engine definiert. Catalyst-Plug-ins sind kaum Beschränkungen unterworfen, da sie direkt in die Request-Verarbeitung eingreifen können. Damit bieten sie eine ähnliche Flexibilität wie Apache-Module.

Erster Schritt bei der Programmerstellung ist meist das Beschreiben der Problem-Domäne, also der Modellschicht. Bei Catalyst zerfällt sie in zwei bis drei Teile: Storage Engine, gegebenenfalls Schema und Modell. Catalyst bietet zahlreiche Storage Engines und fertige Modelle zur Auswahl: So lassen sich Daten per XML-RPC oder LDAP anfordern und aus Blogs oder SVN-Repositories extrahieren. Der Klassiker ist jedoch der Zugriff auf eine Datenbank mit einer Abstraktionsschicht. Das Beispiel benutzt DBIx::Class (DBIC)

DBIC unterstützt das Zusammenfassen von Metadaten (Tabellen, Spalten und deren Attribute) zu einem Schema, was die Wiederverwendung von Teilkomponenten erleichtert. Den verwendeten Datenbanktyp und die Verbindungsparameter definiert ixapp.yml. Für das Tagebuch enthält die Tabelle entry neben dem Primärschlüssel id eine Überschrift (title), ein Textfeld (body) und das Erstellungsdatum (created). Die Syntax zum Erstellen dieser Tabelle ist zwar nicht so deklarativ wie in RoR oder Jifty, aber erfahrene Perler dürften sich zu Hause fühlen.

package iXApp::Schema::Entry;

__PACKAGE__->table('entry');
__PACKAGE__->add_columns(
id => {
data_type =>; 'INT',
is_auto_increment => 1
},
title => { data_type => 'VARCHAR' },
body => { data_type => 'TEXT',
size => 65335 },
created => { data_type => 'DATETIME' }
);
__PACKAGE__->set_primary_key('id');

Damit die Anwendung das Schema kennt, muss man es bei ihr anmelden. Dazu enthält die Datei lib/iXApp/Schema.pm die Zeilen

package iXApp::Schema;
use base qw/DBIx::Class::Schema/;

__PACKAGE__->load_classes;
1;