V několika následujících dílech se budeme věnovat Catalystu, což je MVC framework, který si za krátkou dobu vydobyl velkou popularitu. Catalyst nabízí obrovskou paletu různých nástrojů. Naším cílem nebude kompletně ho popsat, ale spíše seznámit se s jeho filozofií.
30.11.2009 01:00 | Jiří Václavík | přečteno 14232×
Obvyklý způsob navržení webové aplikace funguje takovým postupem, že každá stránka je generována nějakým skriptem. Tento skript nejprve získá data, dále s nimi něco udělá a na závěr vygeneruje HTML výstup. Takový postup bezesporu funguje. My si však nyní představíme jiný přístup.
Model-View-Controller (MVC), pocházející původně ze Smalltalku, je způsob navržení aplikace, který ji rozděluje z hlediska programátora na tři části:
Systém funguje tak, že uživatel vyvolá nějakou událost a ta je předána řadiči, který na základě ní udělá změny v datech. Podle toho, jak se změnila data, nyní může zareagovat i rozhraní.
Přitom platí, že modifikace jedné části by neměla mít vliv na ostatní. Tedy například to, kde jsou uložená data, by nemělo mít vliv na vzhled aplikace.
K vytvoření aplikace je obecně nutné vytvořit tři komponenty, které reflektují právě popsanou architekturu.
Existuje celá řada frameworků implementujících architekturu MVC. Pro představu lze navštívit například wikipedii.
Catalyst je flexibilní web framework využívající architektury MVC inspirovaný zejména konkurenčním Ruby on Rails a Maypolem, který je určený pro rychlé vytváření velkých dobře udržovatelných aplikací. První verze Catalystu vznikla v roce 2005 a od té doby proběhl bouřlivým vývojem.
Catalyst lze používat na všech webových serverech s CGI nebo FastCGI. Pro testovací účely je navíc v distribuci Catalistu zahrnut i vlastní velmi jednoduchý HTTP server, který budeme používat při vývoji.
Další příjemnou vlastností je to, že bude potřeba psát minimum kódu. To ostatně uvidíme v následujících dílech.
Je možné, že je ve vaší distribuci Catalyst již nainstalován, avšak nebývá to pravidlem. Některé distribuce ho dodávají jako balíček libcatalyst-perl.
Pokud Catalyst nainstalovaný nemáte, lze tak učinit standardním postupem pomocí perlového modulu CPAN.
$ cpan -i Catalyst::Runtime Catalyst::Devel
Obvykle se instaluje velké množství závislostí, takže celý proces může trvat i desítky minut. Pokud nastal nějaký problém, můžete se zkusit inspirovat v dokumentaci.
Catalyst je dodáván se shellovým skriptem catalyst.pl. Tento příkaz vytváří kostru každé webové aplikace, na kterou budeme chtít Catalyst použít. Zkusme spustit následující příkaz.
$ catalyst.pl MojeAplikace
Můžeme pozorovat, že se vytvořil adresář MojeAplikace a uvnitř něj řada souborů.
created "MojeAplikace"
created "MojeAplikace/script"
created "MojeAplikace/lib"
created "MojeAplikace/root"
created "MojeAplikace/root/static"
created "MojeAplikace/root/static/images"
created "MojeAplikace/t"
created "MojeAplikace/lib/MojeAplikace"
created "MojeAplikace/lib/MojeAplikace/Model"
created "MojeAplikace/lib/MojeAplikace/View"
created "MojeAplikace/lib/MojeAplikace/Controller"
created "MojeAplikace/mojeaplikace.conf"
created "MojeAplikace/lib/MojeAplikace.pm"
created "MojeAplikace/lib/MojeAplikace/Controller/Root.pm"
created "MojeAplikace/README"
created "MojeAplikace/Changes"
created "MojeAplikace/t/01app.t"
created "MojeAplikace/t/02pod.t"
created "MojeAplikace/t/03podcoverage.t"
created "MojeAplikace/root/static/images/catalyst_logo.png"
created "MojeAplikace/root/static/images/btn_120x50_built.png"
created "MojeAplikace/root/static/images/btn_120x50_built_shadow.png"
created "MojeAplikace/root/static/images/btn_120x50_powered.png"
created "MojeAplikace/root/static/images/btn_120x50_powered_shadow.png"
created "MojeAplikace/root/static/images/btn_88x31_built.png"
created "MojeAplikace/root/static/images/btn_88x31_built_shadow.png"
created "MojeAplikace/root/static/images/btn_88x31_powered.png"
created "MojeAplikace/root/static/images/btn_88x31_powered_shadow.png"
created "MojeAplikace/root/favicon.ico"
created "MojeAplikace/Makefile.PL"
created "MojeAplikace/script/mojeaplikace_cgi.pl"
created "MojeAplikace/script/mojeaplikace_fastcgi.pl"
created "MojeAplikace/script/mojeaplikace_server.pl"
created "MojeAplikace/script/mojeaplikace_test.pl"
created "MojeAplikace/script/mojeaplikace_create.pl"
Change to application directory and Run "perl Makefile.PL" to make sure your install is complete
Uveďme ještě, že obsahovalo-li by jméno aplikace čtyřtečky, nahradily by se lomítkem a vznikla by adresářová struktura.
Přímo v adresáři MojeAplikace je soubor mojeaplikace.conf, což je klasický konfigurační soubor pro aplikaci používající Apache syntaxi. Někdy zde místo něj je soubor se stejnou funkcí s koncovkou .pl nebo .yml, kde mají konfigurační příkazy jiný tvar.
Soubor Makefile.PL slouží k vygenerování Makefile pro build naší aplikace.
Dále zde jsou soubory jako README a Changes, které mají standardní význam.
Také je zde několik důležitých adresářů. Sem patří i lib, kde jsou uloženy moduly pro Controller, View a Model. Již zde existuje soubor MojeAplikace.pm, což je základní modul naší aplikace; dále adresář MojeAplikace, který obsahuje adresáře Controller, Model a View. Zde bude mít aplikace uložené komponenty všech tří typů, které později budeme vytvářet. Jak vidíme, je zde již Controller Root.pm, který se stará o úvodní stránku aplikace.
V adresáři root je skladiště šablon. Podadresář static se používá většinou k uchovávání obrázků, souborů ke stažení nebo CSS.
Adresář t slouží k ukládání testů. Na začátku jsou zde vytvořené 3 testy: 01app.t pro test, zda se aplikace zkompiluje a 02pod.t a 03podcoverage.t pro účely dokumentace.
Nyní nás bude velmi zajímat adresář script obsahující několik perlových skriptů s různými účely.
Soubor script/mojeaplikace_server.pl je jednoduchý HTTP server, který můžeme používat při vývoji aplikace. Tento server spustíme standardním způsobem. Na obrazovce by se měl objevit výstup podobný následujícímu.
$ perl mojeaplikace_server.pl
[debug] Debug messages enabled
[debug] Statistics enabled
[debug] Loaded plugins:
.----------------------------------------------------------------------------.
| Catalyst::Plugin::ConfigLoader 0.27 |
| Catalyst::Plugin::Static::Simple 0.22 |
'----------------------------------------------------------------------------'
[debug] Loaded dispatcher "Catalyst::Dispatcher"
[debug] Loaded engine "Catalyst::Engine::HTTP"
[debug] Found home "/home/test/MojeAplikace"
[debug] Loaded Config "/home/test/MojeAplikace/mojeaplikace.conf"
[debug] Loaded components:
.-----------------------------------------------------------------+----------.
| Class | Type |
+-----------------------------------------------------------------+----------+
| MojeAplikace::Controller::Root | instance |
'-----------------------------------------------------------------+----------'
[debug] Loaded Private actions:
.----------------------+--------------------------------------+--------------.
| Private | Class | Method |
+----------------------+--------------------------------------+--------------+
| /default | MojeAplikace::Controller::Root | default |
| /end | MojeAplikace::Controller::Root | end |
| /index | MojeAplikace::Controller::Root | index |
'----------------------+--------------------------------------+--------------'
[debug] Loaded Path actions:
.-------------------------------------+--------------------------------------.
| Path | Private |
+-------------------------------------+--------------------------------------+
| / | /index |
| / | /default |
'-------------------------------------+--------------------------------------'
[info] MojeAplikace powered by Catalyst 5.80013
You can connect to your server at http://hostname:3000
Tím jsme spustili server. Pokud uděláme změny v adresáři lib, bude třeba webový server restartovat. Pokud však spustíme server s parametry -d -r, bude se o změny starat již spuštěný server sám.
$ perl mojeaplikace_server.pl -d -r
Dále jsou zde skripty mojeaplikace_fastcgi.pl a mojeaplikace_cgi.pl pro spuštění na jiném serveru.
Skript mojeaplikace_test.pl tiskne zdrojový kód požadované stránky bez spuštění serveru a dá se tedy použít na testování. Například pro výpis stránky /nejaka/cesta bychom použili následující příkaz.
$ perl mojeaplikace_test.pl /nejaka/cesta
Na konci výstupu vidíme zdrojový kód Page not found, což je správně, protože jsme zatím nic nevytvořili. Zkusme však otestovat kořenový adresář. Zde by se měl zobrazit zdrojový kód přednastavené webové stránky.
$ perl mojeaplikace_test.pl /
Podívejme se ještě na výstup, který jsme dostali po spuštění serveru. Na konci je uvedena adresa http://hostname:3000, na níž se nám spustil webový server. Můžeme ji tedy zadat do webového prohlížeče a měli bychom spatřit úvodní stránku.