Pro svou bakalářskou práci, kterou jsem obhajoval loni na jaře, jsem si zvolil téma "vývoj redakčního systému NORS". Pojďme se společně podívat, jaké výhody, fičurky a vlastnosti tato kompaktní aplikace přináší.
Důvod vzniku
Jelikož je NORS napsán pro PHP/MySQL, bude vhodné začít tím, proč jsem se vůbec do vývoje "dalšího" redakčního systému pouštěl. Dnešní standard pro psaní webových aplikací zahrnuje použití OOP a některé z osvědčených softwarových architektur (např. MVC, MVP, three-tier atd.). Tyto dva požadavky ale bohužel žádný z dnes rozšířených redakčních systémů nesplňuje. Značná část projektů je psána neobjektově (Wordpress, Drupal, PHP-Nuke) a pokud už objektově psány jsou, pak postrádají rozdělení do vrstev (Joomla, Nucleus, Typo3).
Snahou projektu NORS je tedy přinést aplikaci, která bude nejen dobře vypadat, ale v jejímž kódu se vyzná i někdo jiný, než jen prase :)
Vlastnosti
Projekt bohužel vznikal ještě v době, kdy neexistoval žádný tomuto projektu dobře padnoucí framework. Dnes už ale takový existuje - Nette - a je v plánu pro něj časem aplikaci přepsat.
Architektura
Softwarová architektura není žádným překvapením - použito bylo MVC s Front Controller návrhovým vzorem.
ORM Persistence
Jako ORM persistence byl použit návrhový vzor Active Record, přičemž informace o schématu tabulek databáze nejsou nikde natvrdo zadrátovány v kódu, nýbrž jsou pouze v konfiguračních souborech.
Cachování
Projekt klade silný důraz na vysoký výkon aplikace. Toho je dosahováno např. možností zapnout cachování výstupu (HTML). V případě platnosti cache se pak vůbec nevolá Action Controller, čímž razantně narůstá rychlost zpracování požadavku.
Routing
V aplikaci je programátor zcela odstíněn od formátu URL adres. Napříč aplikací se pracuje pouze s vnitřním požadavkem, který je pomocí routeru překládán na URL a opačně. Tento mechanizmus umožňuje velmi snadno zcela změnit formát URL bez zásahu do kódu.
Lokalizace
Aplikaci je možné přidáním jediného souboru lokalizovat do dalšího jazyka. V plánu je také podpora Gettextu.
Konfigurace
Konfigurace se zapisuje v čistém textu a má syntaxi podobnou jazyku YAML. Jedná se o key-value slovníky, kdy hodnotou může být buď řetězec nebo slovník (důležité je pak odsazení).
style: default
upload_dir: upload
timezone: Europe/Prague
db:
connector: mysql
user: root
password: xxxx
Takto vytvořené konfigurační soubory se velmi snadno převádějí na PHP pole, která se pak dají serializovat a cachovat. V aplikaci pak programátor ke konfiguraci přistupuje jako k objektům ($config->db->user).
Scaffolding
Scaffolding je technika, kdy programátor pouze popíše jakým způsobem se má pracovat s databází a aplikace si pak sama s pomocí této specifikace vygeneruje potřebné třídy (např. CRUD).
Programátor tedy např. napíše specifikaci (schéma) tabulky pro ukládání článků:
table: post
fields:
-id_post: int
+name: string
-id_user: table
id_category: table
text: html
date: datetime
active: bool
comments_allowed: bool
-karma: double
-evaluated: int
-seen: int
photo: file
ids: id_post
indexes:
active_date: active, date
category: id_category
Pokud se pak v kódu pokusí vytvořit instanci třídy ActiveRecord_Post, podívá se aplikace, jestli náhodou nemá k této třídě specifikaci. Pokud ji najde, "zkompiluje" si ji, vytvoří potřebné třídy (ActiveRecord_Post a Table_Post) a pokud odpovídající tabulku nenajde v databázi, tak ji podle specifikace vytvoří.
Schéma tabulky neslouží ale jen pro tvorbu tříd. S pomocí těchto informací dokáže aplikace vytvořit i HTML tabulky a formuláře pro práci se záznamy v databázi. Symboly plus a mínus před názvy sloupců jsou potřebné právě pro tuto činnost. Symbol mínus znamená, že položka nebude ve formuláři zobrazena, plus značí povinnou položku.
Závěr
Přestože se zatím jedná spíše o akademický projekt a s žádným závratným rozšířením nepočítám, některé vlastnosti aplikace určitě stojí za pozornost. Osobně používám NORS jako základ pro vývoj všech webových aplikací. Zejména jeho genericky vytvářená administrace mi během vývoje šetří neuvěřitelné množství času.
Stránky projektu: norsphp.com
Demo (heslo: test, heslo: test): demo.norsphp.com
Bakalářská práce: Vývoj redakčního systému NORS
Jedním slovem - paráda! ;-)
Současný stav volně dostupných RSU vidím naprosto stejně a taky dost vážně přemýšlím o redakčním systému jako téma BP. Chtěl bych ale stavět na Nette, které se snad do té doby stihne vyvinout do stabilní verze 1.0 (v čemž držím Davidovi maximálně palce).
Samotný systém a PDFko jsem jen zběžně prolétl a velice se mi to líbí, doufám že si brzo najdu čas na nahlédnutí do zdrojáků :)
Já sám bych asi jen vynechal scaffolding a získaný čas bych využil na vymakání rozšířitelnosti. Ze zkušenosti si totiž troufám tvrdit že většina programátorů raději použije vlastní řešení, než aby si nechali něco jen tak vygenerovat. Navíc nevím na jaké úrovni lze využít scaffolding ke složitějším dotazům (vidím tam něco jako foreign indexy).
I tak ale velice chválím za skvěle odvedenou práci a nemít už vlastní systém, rozhodně bych se nebál začít stavět právě na tom tvém ;-)