Open Source im professionellen Einsatz

Model-Bau

Als Nächstes teilt der Anwendungsentwickler Flow3 mit, welche Daten es in der Datenbank unterbringen soll. Dazu legt er ein passendes Model an. In Flow3 sind Models nichts anderes als einfache PHP-Objekte. Die Filmverwaltung braucht also nur eine Klasse, die die Daten eines Films kapselt. Der Einfachheit halber sollen das hier nur der Filmname und eine Kurzbeschreibung sein.

Eine passende PHP-Klasse erzeugt das »flow3« -Skript:

./flow3 kickstart:model Roxy.Filme Filmtitel:string beschreibung:string

Demnach soll das Framework eine Klasse »Film« anlegen, die zum Paket »Roxy.Filme« gehört. Sie kapselt zwei Member-Variablen namens »titel« und »beschreibung« , die Zeichenketten aufnehmen (»string« ). Die Klasse »Film« liegt in der Datei »/FLOW3-1.0.0/Packages/Application/Roxy.Filme/Classes/Domain/Model/Film.php« . Wie Listing 3 zeigt, besteht sie nur aus den zwei Variablen nebst Getter- und Setter-Methoden.

Listing 3

Ausschnitt aus Film.php

01 <?php
02 namespace Roxy\Filme\Domain\Model;
03 use TYPO3\FLOW3\Annotations as FLOW3;
04
05 /**
06  * @FLOW3\Scope("prototype")
07  * @FLOW3\Entity
08  */
09 class Film {
10
11         /**
12          * @var string
13          */
14         protected $titel;
15
16         /**
17          * @var string
18          */
19         protected $beschreibung;
20
21         /**
22          * @return string The Film's titel
23          */
24         public function getTitel() {
25                 return $this->titel;
26         }
27
28         // ...
29 }
30 ?>

Normalerweise würde ein PHP-Entwickler jetzt Datenbanktabellen einrichten und sich dann überlegen, wie er die Informationen aus den Variablen dort hineinprügelt. Um all das kümmert sich netterweise Flow3 – vorausgesetzt man greift dem System ein wenig unter die Arme. Dies geschieht durch so genannte Annotationen, die in Kommentaren versteckt sind. Sie geben Flow3 Informationen über eine Klasse, eine Methode oder ein Attribut.

Da PHP von Haus aus keine Annotationen beherrscht, verwendet Flow3 seine eigene Syntax. Gemäß dieser beginnen Annotationen immer mit einem »@« . Das »@var string« in Listing 3 etwa weist darauf hin, dass die Variable »$titel« einen String aufnimmt. Diese Information hilft dem Framework später, eine passende Datenbanktabelle zu erstellen.

Als Nächstes benötigt die Webanwendung ein Repository, das ein Film-Objekt entgegennimmt und in die Datenbank steckt beziehungsweise dort herausholt. Flow3 verlangt, dass für jedes zu speichernde Model ein eigenes Repository existiert. Um eines anzulegen, muss man einfach eine neue Klasse von »Repository« ableiten. Auch diese Aufgabe übernimmt auf Wunsch das »flow3« -Skript. Ein zum »Film« passendes Repository erzeugt:

./flow3 kickstart:repository Roxy.Filme Film

Die generierte Datei »/FLOW3-1.0.0/Packages/Application/Roxy.Filme/Classes/Domain/Repository/FilmRepository.php« zeigt Listing 4. Da die Basisklasse »Repository« schon zahlreiche nützliche Standardmethoden mitbringt, ist außer der Ableitung nichts weiter notwendig. Wer sich über die merkwürdige Backslash-Notation vor »Repository« wundert: Sie gehört zum Namensraum-Konzept von PHP [7]. Die Annotation »@FLOW3\Scope("singleton")« stellt zudem sicher, dass es immer nur ein einziges Film-Repository gibt – mit Hilfe des Entwurfsmusters Singleton.

Listing 4

Klasse FilmRepository

01 <?php
02 namespace Roxy\Filme\Domain\Repository;
03
04 use TYPO3f\FLOW3\Annotations as FLOW3;
05
06 /**
07  * @FLOW3\Scope("singleton")
08  */
09 class FilmRepository extends \TYPO3\FLOW3\Persistence\Repository {
10 }
11 ?>

Immer wenn der Entwickler ein Model oder Repository neu geschaffen oder verändert hat, bringt er mit »./flow3 doctrine:update« anschließend die Datenbanktabellen auf den aktuellen Stand.

Kontrolleur

In der Filmverwaltung soll ein Benutzer später Filme anlegen, löschen, bearbeiten und natürlich auch ansehen können. Diese Aktionen steuert und koordiniert ein Controller, dessen Klasse »flow3« ruck, zuck generiert ist:

./flow3 kickstart:actioncontroller--generate-actions Roxy.Filme Film

Der Controller heißt im Beispiel »Film« . Der Parameter »--generate-actions« verpasst dessen Klasse automatisch Methoden, die ein neues »Film« -Objekt anlegen, bearbeiten und löschen.

Die komplette Anwendung ist damit bereits einsatzbereit: Es genügt, den Controller im Browser über »http://localhost/FLOW3-1.0.0/Web/index.php/Roxy.Filme/Film« beziehungsweise »http://beispiel.local/Roxy.Filme/Film« anzustupsen. Das Ergebnis ist die zwar noch etwas schmucklose, aber voll funktionsfähige Anwendung aus Abbildung 5.

Abbildung 5: Der von Flow3 generierte Film-Controller und die zugehörigen Layoutvorlagen bilden bereits eine voll nutzbare Webanwendung, der lediglich ein wenig Farbe und Layout fehlen.

Was dabei im Hintergrund passiert, verdeutlicht ein Blick in die Klasse des Film-Controllers, der in der Datei »FLOW3 -1.0.0/Packages/Application/Roxy.Filme/ Classes/Controller/FilmController.php« liegt. Ihren Anfang zeigt Listing 5. Veranlasst durch den Aufruf des Browsers aktiviert Flow3 zunächst den »FilmController« . Da keine bestimmte Aktion angegeben ist, führt dieser einfach seine Methode »indexAction()« aus. In ihr bittet er das Film-Repository via »filmRepository->findAll()« um alle gespeicherten Filme. Diese Methode gehört übrigens zum Standardrepertoire der »Repository« -Basisklasse.

Listing 5

Auszug aus der Klasse FilmController

01 <?php
02 namespace Roxy\Filme\Controller;
03 use TYPO3\FLOW3\Annotations as FLOW3;
04 use TYPO3\FLOW3\MVC\Controller\ActionController;
05 use \Roxy\Filme\Domain\Model\Film;
06
07 /**
08  * @FLOW3\Scope("singleton")
09  */
10 class FilmController extends ActionController {
11
12         /**
13          * @FLOW3\Inject
14          * @var \Roxy\Filme\Domain\Repository\FilmRepository
15          */
16         protected $filmRepository;
17
18         /**
19          * @return void
20          */
21         public function indexAction() {
22                 $this->view->assign('films', $this->filmRepository->findAll());
23         }
24
25         // ...

An das Repository-Objekt gelangt der Controller per Dependency Injection: Die Variable »$filmRepository« ist mit der Annotation »@FLOW3\Inject« versehen. Damit signalisiert der Controller: "Ich hätte gerne das Film-Repository in meiner Variablen »$filmRepository« ". Flow3 wertet dies aus und "injiziert" beim Anlegen des Controllers automatisch das Repository in die gewünschte Variable. Dank dieser Technik muss der PHP-Programmierer nicht umständlich Objekte umherschieben beziehungsweise an andere durchreichen.

Das Repository liefert eine Liste mit Filmen zurück, die der Controller mittels »assign()« sofort in eine Standard-View stopft. Die hat er netterweise schon vorab automatisch erzeugt und in der Variablen »$this->view« abgelegt. Gleichzeitig sorgt »assign()« zusätzlich dafür, dass die View die Filmliste ab sofort unter dem Namen »films« kennt. Unter dieser Bezeichnung kann der Webentwickler die Filme praktischerweise auch in den Layoutvorlagen ansprechen und weiterverwenden.

Die View ihrerseits wirft nun im Hintergrund die in Flow3 integrierte Template-Engine Fluid an, die aus den HTML-Dateien in den Verzeichnissen »Roxy.Filme/Resources/Private/Layouts/« und »Roxy.Filme/Resources/Private/Templates/« die fertige Webseite zusammenstellt. Eine eigene View-Klasse muss der Entwickler eigentlich nur dann schreiben und dem Controller unterschieben, wenn er die Seiten anders erzeugen möchte.

Im Beispiel widmet sich Fluid als Erstes der Vorlage unter »Roxy.Filme/Resources/Private/Layouts/Default.html« . Sie enthält den Grundaufbau einer jeden Webseite, das so genannte Layout. Darin könnte man beispielsweise ein Firmenlogo einbinden, das dann auf allen Seiten der Anwendung zu sehen sein würde. In diesem einfachen Beispiel besteht das Layout nur aus einer einfachen HTML-Seite (Listing 6).

Listing 6

Ein einfaches Layout

01 <!DOCTYPE html>
02 <html>
03         <head>
04                 <meta charset="utf-8">
05                 <title><f:render section="Title" /></title>
06                 <f:base />
07         </head>
08         <body>
09                 <f:flashMessages class="flashmessages" />
10
11                 <h1><f:render section="Title" /></h1>
12                 <f:render section="Content" />
13         </body>
14 </html>

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 6 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook