Es muss nicht immer XML sein
Es geht hier kurz um Domain Specific Languages (kurz DSL). Man unterscheidet intern und extern, wobei intern die “Host”-Programmiersprache selbst genutzt wird (zum Beispiel PHP) und extern eine eigene “Minisprache” gewählt werden kann (zum Beispiel xml, sql, regex).
Yii’s migrations in Verbindung mit einer internen DSL eigenen sich hervorragend für zum Beispiel Installationsskripte, Anlegen von Katalogen eines Shopsystems oder oder oder. Hier ein kleines Beispiel, was Daten für eine Bundesliga-Saison einpflegt:
public function safeUp() { Competition::create('1. Bundesliga', '2010/2011') ->addTeam('Hannover 96', 'Hannover') //fügt die ganzen Teams hinzu ->addTeam('FC Bayern München', 'München') ->addTeam('SV Werder Bremen', 'Bremen') ->addTeam('Borussia Dortmund', 'Dortmund') ->addMatchday('1.Spieltag', 1) //liefert einen Spieltag ->addMatch('Hannover', 'München') //fügt dem Spieltag ein Spiel hinzu ->setDatetime('2010-10-10', '15:30') //Anpfiff ->setResult('2:1', '1:0') //Ergebnis ->up() //und wieder zum Spieltag hochhangeln ->addMatch('Bremen', 'Dortmund') //und liefert wieder ein Spiel ->setDatetime('2010-10-10', '15:30') ->setResult('0:2', '0:0') ->up() ->up() //und zum Wettbewerb hochhangeln ->addMatchday('2.Spieltag', 2); } public function safeDown() { //löscht den Wettbewerb wieder Competition::delete('1.Bundesliga', '2010/2011'); }
Ich schreibe hier kein SQL!
Durch dieses Fluent Interface komme ich ohne Variablen aus (dafür aber dieses Hochhangeln (->up()).
Ich brauche kein Frontend für die Dateneingabe. Ich kann den Wettbewerb im safeDown wieder löschen. Durch safeUp/safeDown befinde ich mich automatisch in einer Transaktion, wenn was schiefgeht -> rollback.
Der Vorteil gegenüber einer externen DSL: ich benötige keinen Parser oder Interpreter.
No related posts.
besser ist es, die DSL auszulagern in einen Expression Builder (Fowler):
CompetitionBuilder::create()
->addMatchday()
->on()->at()
->addMatch()
->setDatetime()
->setResult()
->addTeam()