34
Symfony – Ein PHP Webframework Seminararbeit von Maurice Fielauf

Symfony – Ein PHP Webframework

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Symfony – Ein PHP Webframework

Symfony – Ein PHP WebframeworkSeminararbeit von Maurice Fielauf

Page 2: Symfony – Ein PHP Webframework
Page 3: Symfony – Ein PHP Webframework

Eidesstattliche Erklärung

Hiermit versichere ich, dass ich die Seminararbeit mit dem Thema

^ - E\n /?W C^bf(nmpuT4

selbstständig verfasst und keine anderen als die angegebenen Quellen und

Hilfsmittel benutzt habe, alle Ausführungen, die anderen Schriften

wörtlich oder sinngemäß entnommen wurden, kenntlich gemacht sind und

die Arbeit in gleicher oder ähnlicher Fassung noch nicht Bestandteil einer

Studien- oder Prüfungsleistung war.

Ich verpflichte mich, ein Exemplar der Seminararbeit fünf Jahre aufzu-

bewahren und auf Verlangen dem Prüfungsamt des Fachbereiches

Medizintechnik und Technomathematik auszuhändigen.

Name: Ha\\<'\Cf ^'dOLU^

Aachen, den _ ILI ^. 2ö\?>

Unterschrift der Studentin / des Studenten

\\.^

Page 4: Symfony – Ein PHP Webframework
Page 5: Symfony – Ein PHP Webframework

Inhaltsverzeichnis

1 Einleitung 1

2 PHP Webframeworks 32.1 Laravel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42.2 CodeIgniter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

3 Grundidee und Konzept von Symfony 53.1 Arbeiten mit Symfony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

3.1.1 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63.1.2 Ordnerstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73.1.3 Komponenten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

3.2 Model-View-Controller Programmstruktur . . . . . . . . . . . . . . . . . . . . 103.3 PHP Template Sprache Twig . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

3.3.1 Vorteile Twig . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.3.2 Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

3.4 Datenmodell . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

4 Sicherheitsaspekte in Symfony 174.1 Authentifizierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.2 Autorisierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

5 Diskussion 215.1 Vorteile und Stärken von Symfony . . . . . . . . . . . . . . . . . . . . . . . . 215.2 Nachteile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225.3 Fazit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22

6 Zusammenfassung 25

Literaturverzeichnis 27

Institut für Kommunikationssysteme i

Page 6: Symfony – Ein PHP Webframework

Inhaltsverzeichnis

ii RWTH Aachen University

Page 7: Symfony – Ein PHP Webframework

Kapitel 1

Einleitung

Zu Beginn eines Projektes müssen Softwareentwickler viele Entscheidungen bezüglich ihrerSoftware treffen. Sie müssen sich unter anderem fragen, welche Programmiersprache für dasProjekt geeignet wäre, wie ihr Programm strukturiert sein wird und wie hoch der zeitlicheAufwand des Projektes einzuschätzen ist. Je nach Möglichkeit wird man verschiedene bereitsvorhandene Templates und Frameworks in Betracht ziehen, die einem Programmierer dieArbeit erleichtern können, da bereits geschriebener Quellcode wiederverwendet werden kann.Frameworks sind Rahmenwerke, sie liefern häufig bereits fertig implementierte Komponentenund Module, auf Basis derer die Software ausgerichtet werden kann.

Diese Seminararbeit befasst sich mit dem PHP Webframework Symfony. Dabei werden dieGrundidee eines Webframeworks erläutert und zudem, zur Abgrenzung gegenüber anderenWebframeworks, mit Laravel und CodeIgniter zwei weitere PHP Webframeworks vorgestellt.

Um Symfonys Grundidee und Konzept verstehen zu können, wird dieses Thema in einemKapitel behandelt. Darin enthalten ist eine Installationsanleitung von Symfony und dieanschließend zugrunde liegende Ordnerstruktur. Im Zuge dessen wird gezeigt, wie SymfonysKomponenten eingebunden werden können und zur Illustration des Arbeitens mit Symfonywerden mit SwiftMailer und Form zwei nützliche Komponenten demonstriert. Mit Bezug auf dieOrdnerstruktur wird Symfonys sog. Model-View-Controller Programmstruktur veranschaulichtund die PHP Template Sprache Twig und ihre Vorteile benannt. Da bei Webauftritten häufigmit Datenbaken gearbeitet wird, ist Symfonys Datenmodell Lösung Teil des Kapitels.

Bei der Erstellung von Webauftritten spielen Sicherheitsaspekte eine entscheidende Rolle. Einwichtiger Aspekt dieser Arbeit ist die Frage, wie und mit welchen Methoden die Sicherheit mitdem Webframework Symfony gewährleistet werden kann. Aus diesem Grund wird zunächstdas Arbeiten mit Firewalls und Authentifizierung, sowie Autorisierung und Zugriffsrechten imSymfonykontext erläutert.

Abschließend erfolgt eine Diskussion zu der Frage, wann der Einsatz eines PHP Webframeworkswie Symfony sinnvoll ist. Dafür werden Vor- und Nachteile eines Webframeworks am BeispielSymfony gegenübergestellt und in einem Fazit evaluiert.

Ziel dieser Arbeit ist, ein Grundverständnis von Symfony zu vermitteln und eine konkreteIdee zu entwickeln, wann sich die Einarbeitung und Verwendung von Symfony im Rahmenvon Projektarbeiten rentiert.

Institut für Kommunikationssysteme 1

Page 8: Symfony – Ein PHP Webframework

1 Einleitung

2 RWTH Aachen University

Page 9: Symfony – Ein PHP Webframework

Kapitel 2

PHP Webframeworks

PHP Webframeworks sind Rahmenwerke, die in der Programmiersprache PHP geschriebenworden sind. „Webframeworks sind insbesondere für die Entwicklung von dynamischen Web-seiten, Webanwendungen oder Webservices ausgelegt“ [25]. Sie liefern ein Gerüst auf derenBasis ein Programm strukturiert und entwickelt werden kann. Webframeworks bieten keinevolle Funktionalität, d.h. wenn ein Webframework verwendet wird, liegt noch keine fertigeWebanwendung zugrunde. In der Literatur [9], [25], [28] lassen sich verschiedene Definitionenzu Frameworks finden, dabei bleibt die Kernaussage jedoch gleich, wie z.B:

„Ein Framework ist eine semi-vollständige Applikation. Es stellt für Applikationeneine wiederverwendbare, gemeinsame Struktur zur Verfügung. Die Entwicklerbauen das Framework in ihre eigene Applikation ein, und erweitern es derart, dasses ihren spezifischen Anforderungen entspricht. Frameworks unterscheiden sichvon Toolkits dahingehend, dass sie eine kohärente Struktur zur Verfügung stellen,anstatt einer einfachen Menge von Hilfsklassen“ [9].

Bei Frameworks unterscheidet man grundsätzlich zwischen verschiedenen Typen, dessenGrenzen nicht immer ganz strikt definiert sind:

• Application Frameworks [1]

• Komponenten Frameworks [10]

• Test Frameworks [20]

• Webframeworks [25]

Die ersten Webframeworks wurden in den späten 1990er Jahren veröffentlicht. Die gängigstenWebframeworks in heutiger Benutzung wurden allerdings erst 10 bis 20 Jahre später eingeführt.CakePHP ist beispielsweise eines der wenigen noch älteren und etablierten Frameworks. ImGegensatz dazu gibt es die neueren, weit verbreiteten PHP Webframeworks, wie Laravel,CodeIgniter, Phalcon, Zend und Symfony [26].

Im Rahmen dieser Arbeit wird das PHP Webframework Symfony vorgestellt. Um Symfonyjedoch gegenüber anderen Webframeworks genauer abgrenzen zu können, werden zunächstzwei andere PHP Webframeworks kurz vorgestellt.

Institut für Kommunikationssysteme 3

Page 10: Symfony – Ein PHP Webframework

2 PHP Webframeworks

2.1 Laravel

Laravel ist ein quelloffenes PHP Webframework, das 2011 von Taylor Otwell entwickeltworden ist [11], [12]. Es ist mittlerweile eines, wenn nicht sogar das, populärste Frameworkder Webentwickler Community. Laravel wirbt mit besonders gut verständlichem, leserlichenCode, mit dem man rapide, auch bei komplexen Problemen, zu einer Lösung kommt. DasWebframework implementiert das Model-View-Controller Architekturmuster [13] und basiertin Teilen auf Komponenten des Webframeworks Symfony.

Aus der Marke Laravel hat sich bereits ein eigenes „Ökosystem“ entwickelt. So sind seit derGründung von Laravel zahlreiche Services und Erweiterungen entstanden, z.B. Laravel Forge,Laravel Envoyer, Laravel Telescope, usw., die allesamt zahlreiche zusätzlichen Funktionen fürWebentwickler bieten.

Das Laravel Framework ist vom Typ her ein Webframework, weist aber auch die Aspekteeines Komponenten Frameworks auf, da einzelne Funktionen und Erweiterungen verfügbarsind, die auf Wunsch installiert werden können.

2.2 CodeIgniter

Ein weiteres frei verfügbares PHP Webframework ist CodeIgniter [3]-[5]. Die erste offizielleVariante von CodeIgniter wurde 2006 von Ellislab vorgestellt. CodeIgniter läuft genau wieLaravel mit der Model-View-Controller Programmstruktur, was den Code übersichtlicher undleicht wartbar macht.

CodeIgniters Stärken sind u.a. die geringe Einarbeitungszeit und die schnelle Konfiguration.Aufgrund der schnellen Installation und der umfänglichen Konfiguration gilt es als sehrbenutzerfreundlich. Die hohe Performance ist ein weiterer positiver Aspekt, da man zunächstnur Basisklassen installiert und anschließend auf Wunsch spezielle Funktionen und Klassenergänzen kann [4].

Genau wie bei Laravel weist CodeIgniter die Kriterien sowohl für ein Webframework als auchein Komponenten Framework auf.

4 RWTH Aachen University

Page 11: Symfony – Ein PHP Webframework

Kapitel 3

Grundidee und Konzept von Symfony

Nachdem zuvor die beiden PHP Webframeworks Laravel und CodeIgniter kurz vorgestelltworden, wird in diesem Teil der Arbeit Symfony vorgestellt und einige Fakten zu Symfonyaufgeführt.

Symfony ist genau wie Laravel und CodeIgniter frei verfügbar aus dem Internet runter ladbar.Darüber hinaus lässt es sich auch in die Kategorien Webframework und Komponentenframe-work einordnen. Das Webframework wurde 2005 mit der MIT Lizenz veröffentlicht. Unterder führenden Entwicklung von Fabien Potencier gibt es Symfony aktuell in der Version 4.2(Stand: 10.12.2018) [29]. Kommerzielle Unterstützung erhält das Entwicklerteam von derFirma Sensiolabs [16].

Symfonys Stärke liegt darin, dass auf Grund der Struktur Entwickler und Programmierererweiterte quelloffene Bibliotheken einer breiten Anwender-bzw. Entwicklergruppe nutzen bzw.zur Verfügung stellen können. Auf Grund dieses Konzeptes wird die Sicherheit beim Entwi-ckeln von Webauftritten sehr erhöht, da „Sicherheitslücken zeitnah erkannt und ausgemerztwerden“ [24]. Näheres dazu folgt in Kapitel 4. Eine weitere Stärke von Symfony ist die hohePerformance durch bereits eingebundene Caching Funktionen. Das Model-View-ControllerArchitekturmuster ermöglicht eine klare Trennung von Logik und Daten und gibt dem Pro-gramm zusätzlich eine klare vordefinierte Struktur. Die Daten werden durch die DoctrineBibliothek verwaltet [28]. Näheres dazu und was es mit den sog. Bundles, den Komponentenin Symfony, auf sich hat, wird in Abschnitt 3.1.3 erklärt.

Es gibt einige bekannte Webseiten und Dienstleister, die das PHP Webframework Symfonynut zen, wie z.B. notebooksbilliger, BlaBlaCar oder auch Flixbus.

3.1 Arbeiten mit Symfony

Für einen Einstieg in Symfony werden zunächst die Installation, die damit einhergehendeOrdnerstruktur und das Konzept mit den Komponenten beschrieben.

Institut für Kommunikationssysteme 5

Page 12: Symfony – Ein PHP Webframework

3 Grundidee und Konzept von Symfony

3.1.1 Installation

In diesem Abschnitt wird beispielhaft eine Schritt für Schritt Anleitung zur Installationvon Symfony vorgenommen, um den Einstieg in das Framework zu erleichtern. Vorab ist zuerwähnen, dass Symfony auf jedem der gängigen Betriebssysteme installierbar ist. Vor derInstallation des PHP Webframeworks Symfony sollte die Skriptsprache PHP installiert wordensein. In dieser Arbeit wird mit der aktuellen long-term support (lts) Version 3.4 von Symfonyauf einem Windows System gearbeitet.

Um Symfony installieren zu können, wird der Symfony Installer benötigt. Diesen findet manauf der offiziellen Homepage von Symfony. Der Symfony Installer ist PHP 5.4 kompatibel, d.h.es sollte zusätzlich bedacht werden, dass die PHP Installation mindestens auf die Version 5.4zurückgehen sollte. Da in dieser Arbeit der Fokus auf der lts Version von Symfony liegt, mussdarauf geachtet werden, dass die kleine graue Box die entsprechende 3.4 Version selektierthat. Sollte eine andere Version in Betracht gezogen werden, kann diese einfach ausgewähltwerden und der Anleitung der Webseite Folge geleistet werden.

Der Symfony Installer muss lediglich einmal auf dem System über die Konsole installiertwerden. Nach der Installation sollte man einen Symfony Befehl auf der Konsole ausführenkönnen. Zu empfehlen ist, dass man den Symfony Installer sofort in das richtige Verzeichnisspeichert, in dem hinterher auch das Projekt landen soll. Das Problem liegt darin, dass derSymfony Befehl unter Windows nicht global ausführbar ist, d.h. man kann den Symfony Befehldann nur in dem Ordner ausführen, in dem sich der Symfony Installer befindet. Daher ist essinnvoll den Installer bereits im richtigen Verzeichnis zu haben und nicht noch verschieben zumüssen.

Um den Symfony Installer nun herunterzuladen, wird folgender Befehl auf der Konsoleausgeführt:

1 php -r "file_put_contents('symfony', file_get_contents('https://symfony.com/installer'));"

An dem Link https://symfony.com/installer ist zu erkennen, dass es sich hierbei nichtum eine Schadsoftware handelt, sondern um Daten von der offiziellen Symfony Homepage.Wenn der Download abgeschlossen ist, kann in dem Verzeichnis, in dem sich der Installerbefindet, der Befehl

1 symfony new my_project_name 3.4

ausgeführt werden. Alternativ, wenn die Installation von Symfony via dem Symfony Installeraus irgendeinem Grund nicht funktionieren sollte, kann man auf den Composer zurückgreifen.Der Composer ist ein Paket Manager der die Dependencies in modernen PHP Applikationenwie in Symfony verwaltet. Unter folgender Webseite https://getcomposer.org/download/ist der Composer kostenfrei verfügbar. Nach der Installation sollte der Composer globalverfügbar sein. Anschließend kann über den Befehl

1 composer create project symfony/framework-standard-edition my_project_name

in der Konsole ein neues Symfony Projekt mit dem Namen my_project_name erstellt werden.

Wenn einer der beiden aufgeführten Konsolenbefehle erfolgreich ausgeführt wurde, wird einneuer Ordner unter dem Namen my_project_name angelegt. Möchte man einen anderenNamen verwenden, kann man an dem Befehl diesen Teil einfach abändern. Die Ziffer 3.4 amEnde des symfony Befehls steht für die Version von Symfony, die installiert werden soll. Wennman eine frühere oder eine spezifische Version von Symfony bevorzugt, kann statt der 3.4

6 RWTH Aachen University

Page 13: Symfony – Ein PHP Webframework

3.1 Arbeiten mit Symfony

einfach eine andere Version installiert werden. Genaueres dazu findet man auf der Website vonSymfony https://symfony.com/doc/3.4/setup.html unter dem Abschnitt „Basing yourProject on a Specific Symfony Version“ [19].

3.1.2 Ordnerstruktur

Wenn der Download des Symfony Installers erfolgreich war und die gewünschte SymfonyVersion installiert ist, bemerkt man, dass in dem Projektordner bereits eine umfangreicheOrdnerstruktur angelegt wurde. Diese Ordnerstruktur nennt man metaphorisch den „Website-Skeleton“, da hiermit das Grundgerüst eines Webauftritts bereits geschaffen wurde undSymfony automatisch eine erste Beispielseite generiert.

Symfony schafft insgesamt sieben neue Ordner, die im Folgenden genauer erläutert werden:

app In dem app Ordner befinden sich Konfigurations- und Templatedateien. In dem Ordnerselbst gibt es also erneut eine Aufteilung in config und Ressources. In dem configOrdner kann man sämtliche Einstellungen des Projektes anpassen. Dort sind auchDateien, wie z.B. die security.yml zu finden, in der man u.a. die Firewalls für dieZugriffsrechte der Nutzer konfigurieren kann oder die config.yml Datei, in der manKonfigurationsinformationen referenziert auf die parameters.yml Datei findet. ZurKonfiguration des Projektes wird die parameters.yml geändert, um eine logischeTrennung zu gewährleisten. In dem Ressources Verzeichnis werden die Twig Dateienabgelegt. Die Dateien mit der Endung „html.twig“ generieren das Webdesign für denBenutzer und präsentieren die Logik.

bin Zu Beginn enthält der bin Ordner zwei Dateien. Hierbei handelt es sich um ausführbareDateien, die Konsolenbefehle ermöglichen. Die console Datei ist insofern eine sehrwichtige Datei, als dass der php bin\console einer der vermutlich am häufigstengenutzten Befehle beim Arbeiten mit Symfony sein wird.

src Der src Ordner beinhaltet den PHP Code. Hier liegt sämtlicher selbst erzeugter Quellcode,der u.a. in die Controllerklassen eingebettet ist. Im Unterordner AppBundle/Con-troller sind die Controllerklassen zur Steuerung der Logik innerhalb der Anwendung.Die Funktion der Controller wird in Abschnitt 3.2 deutlich. In Symfony sind Control-ler eigene PHP Klassen, die eine sog. action Methode besitzen. Durch Annotationenwerden einer oder mehreren action Methoden innerhalb eines Controllers eine sog.Route zugewiesen, also eine URL unter der die Inhalte präsentiert werden. Diese actionMethoden implementieren konventionell einen Teil der Logik, beispielsweise würde eineloginAction Methode Quellcode für den Login eines Benutzers bereitstellen.

tests In diesem Ordner sind die automatisierten Tests, z.B. Unit Tests für die Anwendungenin Symfony.

var Hier liegen alle automatisch generierten Dateien. Es werden z.B. Cache Files für erhöhtePerformance, Log Dateien zur Fehlererkennung sowie Behebung und Session Dateienzwischengespeichert.

vendor Alle Drittanbieter Bibliotheken und Komponenten befinden sich hier. Dort liegt zumBeispiel ein Ordner für Doctrine, dem Datenbankmanagementsystem und die TwigBibliotheken zur Kompilierung der Twig Syntax.

Institut für Kommunikationssysteme 7

Page 14: Symfony – Ein PHP Webframework

3 Grundidee und Konzept von Symfony

web Der web Ordner ist das Wurzelverzeichnis der Projektes. Hier befinden sich alle öffentlichvon dem Benutzer zugänglichen Dateien, wie z.B. CSS, JS oder Bilddateien. Wenn dieseDateien nicht in diesem Ordner liegen sollten, wäre der Nutzer nicht in der Lage Bildero.ä. zu sehen und die Präsentation wäre entsprechend beeinträchtigt.

In Symfony erfolgen die meisten Arbeiten in den Ordnern src und app, da man dort deneigenen Quellcode ablegt. Zu Beginn eines Projektes wird häufiger im app Ordner gearbeitet,da man dort zunächst das Projekt ausrichtet und nach seinen Wünschen konfiguriert.

3.1.3 Komponenten

Als Webkomponenten Framework bietet Symfony einige fertig implementierte Klassen, diefür ein Webprojekt hilfreich sein könnten. Hier wird zunächst illustriert, wie man SymfonysKomponenten, die Bundles, installieren kann. Im Anschluss werden weitere wichtige Bundlesvorgestellt.

Für die Installation von Bundles in Symfony benötigt man zunächst den Composer, der zuvorinstalliert sein sollte. Mit dem Konsolenbefehl composer require symfony/component kanneine neue Komponente installiert werden. Wichtig ist, dass man sich im Projektverzeichnisbefindet, bevor man den Befehl ausführt, da es sonst zu Fehlern kommen kann. Componentist in dem obigen Befehl ein Platzhalter und kann einfach durch den Namen der Komponenteersetzt werden. Auf Symfonys Website https://symfony.com/components können die ver-schiedensten Komponenten eingesehen werden. Hier erhält man den richtigen Konsolenbefehlnach Auswahl der präferierten Komponente im Menü. In dem Unteren Teil der Seite sindSymfonys Komponenten aufgelistet und mit der jeweiligen Dokumentation verlinkt.

Wenn eine Komponente heruntergeladen und installiert wurde, wird sie im vendor Ordnerdes Symfony Projektes gespeichert. Sollte man eine Komponente nicht benötigen und somitentfernen wollen, gelingt dies über den Befehl composer remove component, wobei componenterneut als Platzhalter dient und durch die Komponente ersetzt werden muss, die entferntwerden soll. Um eine Übersicht über alle bereits installierten Komponenten zu erhalten, kannman den Konsolenbefehl composer show nutzen. Mit diesem Befehl wird auch die aktuelleVersion des Bundles und eine kurze Beschreibung hinterlegt.

Komponentenbeispiele

In diesem Abschnitt werden einige nützliche Komponenten kurz vorgestellt und ein Programm-beispiel gezeigt.

SwiftMailer

Die SwiftMailer Bibliothek bietet Funktionalitäten zum Versand von E-Mails und ist bereitsstandardmäßig bei einer Symfony Version 3.x installiert. Bei einer installierten Symfony 4.xVersion kann die Komponente über die bereits beschriebene Methode nachinstalliert werden.Die Möglichkeit E-Mails in der Webapplikation zu versenden kann sehr nützlich sein, z.B. umdem Administrator der Website eine E-Mail für Verbesserungsvorschläge, Anregungen undKritik zu senden.

8 RWTH Aachen University

Page 15: Symfony – Ein PHP Webframework

3.1 Arbeiten mit Symfony

Alternativ zu einem selbst implementierten Mail Server kann auf einen Mail Hosting Provi-der, wie beispielsweilse Mandrill, der SwiftMailer unterstützt, zurückgegriffen werden. UmSwiftMailer nutzen zu können, wird die Komponente für den Mail Server konfiguriert. Wiein der config.yml Datei zu erkennen ist, gibt es bereits einige Voreinstellungen, die in derparameters.yml geändert werden können.

1 # app/config/config.yml2 swiftmailer:3 transport: '%mailer_transport%'4 host: '%mailer_host%'5 username: '%mailer_user%'6 password: '%mailer_password%'

Um den Einstieg in das Arbeiten mit der SwiftMailer Komponente zu erleichtern, bietetSymfonys Dokumentation ein einfaches Sourcecode Beispiel dazu an.

1 public function indexAction($name, \Swift_Mailer $mailer)2 {3 $message = (new \Swift_Message('Hello Email'))4 ->setFrom('[email protected]')5 ->setTo('[email protected]')6 ->setBody(7 $this->renderView(8 // app/Resources/views/Emails/registration.html.twig9 'Emails/registration.html.twig',

10 array('name' => $name)11 ),12 'text/html'13 )14 /*15 * If you also want to include a plaintext version of the message16 ->addPart(17 $this->renderView(18 'Emails/registration.txt.twig',19 array('name' => $name)20 ),21 'text/plain'22 )23 */24 ;25

26 $mailer->send($message);27

28 // or, you can also fetch the mailer service this way29 // $this->get('mailer')->send($message);30

31 return $this->render(...);32 }

Hierbei handelt es sich um die indexAction eines Controllers. Der Methode werden dieVariablen $name als Zeichenkette und \Swift_Mailer $mailer als SwiftMailer Objektübergeben. Die $mailer Variable wird später zum Versenden des $message Objektes verwendet(s. Zeile 26). Die Methode setFrom legt den Absender fest, setTo den Empfänger und setBodylegt den Inhalt der Nachricht fest [18].

Institut für Kommunikationssysteme 9

Page 16: Symfony – Ein PHP Webframework

3 Grundidee und Konzept von Symfony

Form

Das Form Bundle in Symfony erlaubt die einfache Erstellung, Bearbeitung und Wiederver-wendung von Formularen für den Endanwender. Form ermöglicht dem Endanwender mit denDaten der Anwendung zu interagieren und diese ggf. zu verändern. So können zum BeispielTermine für eine Kalender Applikation oder Blogeinträge verwaltet werden [8].

Beispielhaft ist hier ein Quellcode Beispiel zur Erstellung eines Formulars, um Aufgaben mitFälligkeitsdatum eintragen zu können, dargestellt:

1 // src/Acme/TaskBundle/Controller/DefaultController.php2 namespace Acme\TaskBundle\Controller;3

4 use Symfony\Bundle\FrameworkBundle\Controller\Controller;5 use Symfony\Component\HttpFoundation\Request;6 use Symfony\Component\Form\Extension\Core\Type\TextType;7 use Symfony\Component\Form\Extension\Core\Type\DateType;8

9 class DefaultController extends Controller10 {11 public function newAction(Request $request)12 {13 // createFormBuilder is a shortcut to get the "form factory"14 // and then call "createBuilder()" on it15

16 $form = $this->createFormBuilder()17 ->add('task', TextType::class)18 ->add('dueDate', DateType::class)19 ->getForm();20

21 return $this->render('@AcmeTask/Default/new.html.twig', array(22 'form' => $form->createView(),23 ));24 }25 }

In Symfony werden Formobjekte durch ein FormBuilderObjekt erzeugt. Wird der FormBuilderin Zeile 16 aufgerufen, werden über die add Methode Felder hinzugefügt und konfiguriert. Inder Klammer hinter add wird erst der Name des Feldes angegeben und dann der Typ desFeldes. In diesem Beispiel gibt es ein Feld task als Text Feld. Das zweite Feld ist ein DatumFeld mit dem Namen dueDate, welches das Fälligkeitsdatum repräsentiert.

Neben der Erstellung eines Formulars muss es auch bearbeitet werden, damit der Anwenderes entsprechend nutzen kann. Wenn der Nutzer das Formular ausfüllt und den „Abschi-cken“ Button gedrückt hat, können mit dem Befehl $form->handleRequest($request);die Formulareinreichungen bearbeitet werden. Standardmäßig werden die Daten über dasPOST Protokoll bearbeitet, wenn man das jedoch ändern möchte oder aber auch weitereCodebeispiele und Konfigurationen betrachten will, ist dies über Symfonys Dokumentationhttps://symfony.com/doc/3.4/components/form.html möglich.

3.2 Model-View-Controller Programmstruktur

„Model View Controller (MVC, englisch für Modell-Präsentation-Steuerung) ist ein Musterzur Unterteilung einer Software in die drei Komponenten: Datenmodell (englisch model),

10 RWTH Aachen University

Page 17: Symfony – Ein PHP Webframework

3.2 Model-View-Controller Programmstruktur

Präsentation (englisch view) und Programmsteuerung (englisch controller)“ [13]. Diese Kom-ponenten agieren via Schnittstellen miteinander, sodass eine klare Kapselung gegeben ist.Durch das Beobachter Verhaltensmuster werden Änderungen von denjenigen Komponenten,die voneinander abhängen, erkannt und entsprechende Änderungen vorgenommen [2] DasZiel des Musters ist ein flexibler Programmentwurf, der offen für Erweiterungen ist und dieEntwicklungszeit für Programme mit Benutzerinteraktion reduziert, daher wird dieser Entwurfhäufig in der Webentwicklung verwendet. Hier werden die einzelnen Komponenten gesonderterklärt:

Model Das Model ist für die Datenverwaltung zuständig und vollkommen unabhängigvon View und Controller. Es enthält alle zusätzlichen nötigen Daten, wie z.B. Be-nutzerdaten und nutzt dazu häufig Datenbanken. In Symfony wird mit der DoctrineKomponente gearbeitet, die sämtliche Datenbankschnittstellen zur Verfügung stellt. Beider Arbeit mit Datenbanken werden sog. Entity Klassen erstellt, mit denen man dieDatenstruktur für die Datenbank vorgeben kann. Diese Klassen werden in Symfony indem src Ordner abgelegt und klassischer Weise werden die Entity Klassen mit demKlassennamen äquivalent zum Entitynamen der Datenbank in einem neuen OrdnerEntity gespeichert.

View Das View ist für die Präsentation der Daten des Models verantwortlich. Die Prä-sentation kennt die Daten zwar, die sie dem Benutzer präsentiert, ist jedoch nicht fürdie Verarbeitung zuständig. Damit ist sie vom Controller unabhängig. Sollte sich beiden Daten etwas ändern, verändert sich die Präsentation derart, dass die neue Mengean Daten entsprechend dargestellt wird. In Symfony wird die Präsentation durch dieKlassen im Unterordner ressources von app untergebracht.

Controller Der Controller ist das Steuerelement dieser drei Komponenten. Die Funktions-weise des Controllers wird in Abbildung 3.1 deutlich. Das Programm wird dadurchdahingehend gesteuert, dass diese Klasse auf Benutzerinteraktionen reagiert und dasModel verständigt (2). In dem Fall werden Daten(bank)abfragen ausgeführt und dieDaten zum Controller zurückgeliefert (3). Diese Daten werden an das View gesendet(4) und dem Benutzer dargestellt (5). Die Controllerklassen findet man in Symfony imUnterorder controller von src.

An folgendem Programmierbeispiel wird gezeigt, wie Symfonys Controllerklassen funktionieren:1 class LuckyController extends Controller2 {3 /**4 * @Route("/lucky/number")5 */6 public function numberAction()7 {8 $number = random_int(0, 100);9

10 return $this->render('lucky/number.html.twig', array(11 'number' => $number,12 ));13 }14 }

In diesem Beispiel wird eine Zufallszahl zwischen 0 und 100 generiert. Durch die Annota-tion in Zeile 4 wird eine Route erstellt. Routen bewirken, dass ein relativer Pfad als URLerstellt wird, sodass die nachfolgende numberAction Methode aus Zeile 6 unter der URL

Institut für Kommunikationssysteme 11

Page 18: Symfony – Ein PHP Webframework

3 Grundidee und Konzept von Symfony

relativerPfad/lucky/number aufgerufen wird. Die action Methoden aus Controllernbeinhalten den Logikteil des Programms, welcher teils am Namen der action abzulesen ist. InZeile 10 wird schließlich eine Datei aus dem View geladen, die eine Twig Datei ist. Zusätzlichwird durch die array Anweisung in Zeile 10f., die zufällig generierte $number zwischen 0 und100 mit übergeben.

Abbildung 3.1: Blockdiagramm eines Model-View-Controller Systems [14]

3.3 PHP Template Sprache Twig

In diesem Abschnitt wird die PHP Template Sprache Twig vorgestellt, die Vorteile beleuchtetund die Syntax erläutert, um den Start in die Programmierung mit Twig zu erleichtern.

Twig wurde von Fabien Potencier, dem Erfinder von Symfony, entwickelt und ist unter derBSD Lizenz autorisiert. Somit ist Twig die standardisierte Template Umgebung für Symfonyund auch frei verfügbar. Twig implementiert nahezu keine Programmlogik sondern regelt diePräsentation und dient somit als Schnittstelle zwischen der Programmlogik von PHP und derPräsentation von HTML und CSS [21].

Im vorherigen Abschnitt wurde angesprochen, dass der Controller die Anfragen der Benutzerbedient. Dabei gibt der Controller diese Arbeit an die Template Engine Twig weiter, durchdie die Präsentation für den Benutzer erfolgt. Twig ist also im wesentlichen Teil die ViewKomponente in der Model-View-Controller Programmstruktur.

3.3.1 Vorteile Twig

Zwar ist die Programmiersprache PHP selbst eine Template Engine, aber sie besitzt nichtden Umfang an Möglichkeiten, die moderne Template Engines haben sollten. In diesemAbschnitt werden einige Vorzüge für die neue Template Engine Twig als Erweiterung zu PHPals Template Engine selbst aufgezeigt.

Twig ist sehr prägnant und einfach zu erlernen. Die Template Sprache wurde für Webentwickleroptimiert, sodass man nicht viel Zeit und Aufwand aufbringen muss, um sie zu lernen. Die

12 RWTH Aachen University

Page 19: Symfony – Ein PHP Webframework

3.4 Datenmodell

Sprache PHP ist üblicherweise relativ wortreich und langatmig, während Twigs Syntax knapperund leserlicher ist.Twig kompiliert die Templates in optimierten PHP Code. Dabei wird der Overhead imVergleich zum PHP Code auf ein Minimum gekürzt. Dadurch ist Twig schnell und performant.Twig bietet eine sehr gute Dokumentation, die Online abrufbar ist. Dabei ist die TemplateSprache durch Unit Tests stabil und in großen Projekten nutzbar.Twig unterstützt Vererbbarkeit. Vererbbarkeit ist ein wichtiges Feature beim Errichten vonTemplates, da somit ein Template das andere erweitern bzw. konkretisieren kann. Somiterhöht sich die Übersichtlichkeit des Codes. Fehler an einer Stellen müssen nicht im gesamtenCode gesucht werden und können an entsprechender Stelle korrigiert werden [23].

3.3.2 Syntax

Zunächst ist zu erwähnen, dass Twig Code in HTML Code integriert wird. In Abschnitt 3.1.2wurde bereits angegeben, dass im Ordner app die Twig Dateien zu finden sind. In Twigwerden Befehle in geschweiften Klammern dargestellt.{{ ... }} Dieser Befehl gibt eine Variable, das Resultat eines Ausdrucks oder eine vorgegebene

Zeichenkette aus.{% ... %} Mit diesem Befehl werden Kontrollstrukturen, wie z.B. Schleifen ausgeführt.{# ... #} Hiermit lässt sich ein Kommentar schreiben. Der Kommentar wird nicht mit

ausgegeben und dient nur zur Hilfe oder Strukturierung des Codes. Dabei ist es möglichden Kommentar als Zeilenkommentar aber auch als Blockkommentar über mehrereZeilen zu verwenden [22].

Durch diesen Befehl wird die $number Variable aus dem Controller Beispiel in Abschnitt3.2 für den Benutzer als große Überschrift ausgegeben.

1 {# app/Resources/views/lucky/number.html.twig #}2

3 <h1>Your lucky number is {{ number }}</h1>

3.4 Datenmodell

Das Arbeiten mit Datenbanken, vor allem das Einschreiben und Lesen der Daten daraus, isteine der herausfordernsten Aufgaben moderner Webanwendungen. Eine bereits vorinstallierteKomponente von Symfony heißt Doctrine und ist eine Drittanbieter Bibliothek, die das Da-tenmodell von Symfony prägt. Das Ziel von Doctrine ist durch mächtige programmatischeWerkzeuge Datenbankinteraktionen so einfach und flexibel wie möglich zu machen. Doctrineunterstützt Object-Relational-Mapping (ORM). Das bedeutet, dass jeder Relation der Daten-bank eine eigene PHP Entity Klasse zugeordnet wird. In diesem Teil der Arbeit werden dieersten Schritte mit Doctrine anhand Symfonys Dokumentation vorgestellt und am Beispieleiner Produkt Tabelle gezeigt, wie man in Symfony mit Datenbanken arbeiten kann [6], [7].Als erstes müssen die Datenbankverbindungsinformationen hinterlegt und konfiguriert werden.Dazu sucht man die parameters.yml Datei im Verzeichnis app/config/ auf. Dort findetman unter dem Reiter parameters einige Daten, die zur Konfiguration der Datenbank wichtigsind.

Institut für Kommunikationssysteme 13

Page 20: Symfony – Ein PHP Webframework

3 Grundidee und Konzept von Symfony

1 parameters:2 database_host: localhost3 database_name: test_project4 database_user: root5 database_password: password

Die Parameter, die hier angegeben werden, sind selbsterklärend und können auf die eigenenNamen angepasst werden. Sollten die Daten hinterlegt worden sein, kann durch einen einfachenKonsolenbefehl die Datenbank erstellt werden.

1 php bin/console doctrine:database:create

Wenn die Datenbank erfolreich erstellt wurde, können bereits erste Tabellen organisiert werden.Dies kann mithilfe einer PHP Klasse bewerkstelligt werden. Im Ordner AppBundle erstelltman einen neuen Ordner namens Entity. Darin kann man dann die Entityklasse erstellen,die den Namen der Tabelle haben sollte. In diesem Fall wird die Klasse Product erstellt undeinheitlich wird dem Product vier Attribute zugewiesen: eine eindeutige ID, Name, Preis undBeschreibung.

1 {2 private $id;3 private $name;4 private $price;5 private $description;6 }

Es wäre auch sinnvoll, passende Getter- und Settermethoden zu implementieren. Diesekönnen später beim Ein- und Auslesen der Daten aus der Datenbank nützlich sein. DamitDoctrine die Korrepsondenz zwischen der Tabelle in der Datenbank und der Produkt EntityKlasse erstellen kann, muss eine sog. „Mapping Information“ hinterlegt werden. Die Spaltenin der Datenbanktabelle müssen mit den Attributen der PHP Klasse übereinstimmen. Úmdies sicherzustellen, müssen einige Anmerkungen im Quellcode hinterlegt werden. Das könntefolglich so aussehen:

1

2 use Doctrine\ORM\Mapping as ORM;3

4 /**5 * @ORM\Entity6 * @ORM\Table(name="product")7 */8 class Product9 {

10 /**11 * @ORM\Column(type="integer")12 * @ORM\Id13 * @ORM\GeneratedValue(strategy="AUTO")14 */15 private $id;16

17 /**18 * @ORM\Column(type="string", length=100)19 */20 private $name;21

22 /**23 * @ORM\Column(type="decimal", scale=2)24 */

14 RWTH Aachen University

Page 21: Symfony – Ein PHP Webframework

3.4 Datenmodell

25 private $price;26

27 /**28 * @ORM\Column(type="text")29 */30 private $description;31 }

Mit dem ersten Befehl in Zeile 2 wird gewährleistet, dass man den @ORM Befehl in denAnmerkungen benutzen kann. Dieser gibt an, dass es sich um eine Doctrine Anmerkungbzgl. der Datenbankinformationen handelt. @ORM\Table(name=Product) gibt an, dass dieTabelle, auch Relation genannt, Product heißt und dies auch die zugehörige Klasse ist. Durch@ORM\Column() wird angegeben, dass es sich um eine Spalte in der Tabelle handelt. DasSchlüsselwort type= in der Klammer gibt an, was für eine Datenstruktur bei diesem Attributvorliegt. Zusätzlich kann man bei manchen Attributen noch eine maximale Länge o.ä. vorgeben,wie in Zeile 18.

Fortgeschrittene Entwickler können den Konsolenbefehlphp bin/console doctrine:generate:entity nutzen, um eine Entity Klasse zu erstellen.Wenn man diese Methode wählt, werden Fragen zu der Entität gestellt, um die gewünschteKlasse anzulegen.

Nachdem die Entity Klasse erstellt wurde, kann man zunächst über den Befehlphp bin/console doctrine:schema:validate überprüfen lassen, ob die Korrespondenz mitder Datenbank funktioniert. Sollte dies der Fall sein, kann die Relation über den Befehlphp bin/console doctrine:schema:update –force angelegt, bzw. aktualisiert werden.

Im nächsten Schritt geht es darum Objekte in die Datenbank einzuschreiben und wieder auszu-lesen. Anhand des folgenden Programmierbeispieles und der Kommentare soll gezeigt werden,wie man den SQL Befehl der INSERT Abfrage zum Einschreiben von Daten programmatischumsetzen kann. Dies wird innerhalb einer action Methode eines Controllers realisiert:

1 public function createAction()2 {3 // Der Entitiy Manager wird via $this->getDoctrine() aufgerufen4 // Entity Manager fuehrt spaeter die INSERT Abfrage aus5 $entityManager = $this->getDoctrine()->getManager();6

7 // neues Objekt erstellen8 // Werte ueber setter setzen9 $product = new Product();

10 $product->setName('Keyboard');11 $product->setPrice(19.99);12 $product->setDescription('Ergonomic and stylish!');13

14 // evtl Abfrage durchfuehren15 // aber die Abfrage wird noch nicht ausgefuehrt ...16 $entityManager->persist($product);17

18 // Anfrage tatsaechlich ausfuehren19 $entityManager->flush();20

21 return new Response('Saved new product with id '.$product->getId());22 }

Um das Ergebnis zu überprüfen, muss eine Route mittels Annotationen erstellt werden, um eineURL zu generieren, mit der die Methode im Browser aufgerufen werden kann. Anschließend,

Institut für Kommunikationssysteme 15

Page 22: Symfony – Ein PHP Webframework

3 Grundidee und Konzept von Symfony

wenn die Datenbank mit Objekten gefüllt ist, möchte man diese auch aus der Datenbankerhalten können. Dies erfolgt über die showAction Methode in einem Controller:

1 public function showAction($productId)2 {3 $product = $this->getDoctrine()4 ->getRepository(Product::class)5 ->find($productId);6

7 if (!$product) {8 throw $this->createNotFoundException(9 'No product found for id '.$productId

10 );11 }12

13 // hier kann noch etwas getan werden,14 // wie etwa das Objekt in ein Template speisen o.ae.15 }

In dieser showAction Methode wird die Variable $productid mit übergeben. Diese Variablestellt das zu suchende Produkt dar, welches anhand seiner eindeutigen ID gesucht wird. Wirdjenes Produkt nicht gefunden, wird eine createNotFoundException geworfen, d.h. es kommtzum Programmabbruch und einer Fehlermeldung im Browser.

Beim Einsatz von Datenbanken ist die Sicherheit der Daten ein wesentliches Thema. WelcheSicherheitskonzepte Symfony offeriert und wie man diese einsetzt wird im nächsten Kapitelveranschaulicht.

16 RWTH Aachen University

Page 23: Symfony – Ein PHP Webframework

Kapitel 4

Sicherheitsaspekte in Symfony

Sicherheit ist ein sehr wichtiges Thema, besonders bei Webauftritten, bei denen mit sensitivenDaten gearbeitet werden, die von Hackern abgegriffen werden könnten. Durch bekannte Hacker-methoden, wie z.B. SQL-Injection oder Cross-Site-Scripting (XSS), werden Sicherheitslückenin einer Webanwendung ausgenutzt. In diesem Abschnitt wird gezeigt, welche MaßnahmenSymfony zur Prävention von Hackerangriffen bereitstellt und wie sensitive Daten geschütztwerden können.

Sicherheitskonzepte sind genauso komplex wie die Angriffsmethoden, die potentielle Gefährderfür Webseiten entwerfen. Sie entwickeln sich stetig weiter und um größtmögliche Sicherheit ga-rantieren zu können, müssen sich auch die Maßnahmen zur Verhinderung von Sicherheitslückenstetig erweitern. „Durch das Datenbankmanagement und die integrierte Template-Enginewerden Standardlücken, die XSS oder SQL-Injection ermöglichen, bereits im Vorfeld ausge-schlossen“ [15]. Mögliche neue Sicherheitslücken werden durch Symfonys große Gemeinschaftvon Entwicklern zeitnah erkannt und durch ihr professionelles Sicherheitsmanagement behoben.

Dem Thema Sicherheit ist bei der Doku von Symfony ein gesonderter Eintrag mit mehrerenUnterkapiteln und Lektionen gewidmet worden, in denen Symfonys umfangreiches Sicherheits-system näher gebracht wird. Hierbei werden Symfonys Firewalls und die Benutzerauthentifi-zierung, sowie die Autorisierung thematisiert. Im folgenden wird dieser umfangreiche Artikelhttps://symfony.com/doc/3.4/security.html vorgestellt und auf die wichtigsten Aspektehingewiesen.

4.1 Authentifizierung

Wie schon bei anderen Anleitungen gesehen, wird bei der Konfiguration begonnen. SymfonysSicherheitssystem wird durch die security.yml im Ordner app/config widergespiegelt. Darinbefinden sich die Firewalls. Dieses Schlüsselwort ist der Kern der Authentifizierung. Bei derStandardkonfiguration gibt es bereits eine dev Firewall. Diese Konfiguration verhindert, dassURLs von Symfonys Entwicklungstools nicht geblockt werden. Ansonsten wird konventionelllediglich eine eigene Firewall sinnbildlich als Sicherheitssystem konfiguriert.

1 security:2 providers:

Institut für Kommunikationssysteme 17

Page 24: Symfony – Ein PHP Webframework

4 Sicherheitsaspekte in Symfony

3 in_memory:4 memory: ~5

6 firewalls:7 dev:8 pattern: ^/(_(profiler|wdt)|css|images|js)/9 security: false

10

11 main:12 anonymous: ~13 http_basic: ~

Wenn kein pattern vorhanden sein sollte, bedeutet dies, dass alle URLs betroffen sind, wiedas bei der main Firewall in Zeile 11 der Fall ist. Damit diese URLs keine Authentifizierungbenötigen, gibt es das anonymous Schlüsselwort. Dies erlaubt einem Benutzer eine Websitezu besuchen, ohne sich vorher eingeloggt haben zu müssen, was bei Homepages von großerRelevanz ist.

Die wesentliche Aufgabe der Firewall ist also zu bestimmen, wie sich der Benutzer authen-tifizieren wird. Dies wird im Beispiel mit einer http_basic Authentifizierung bewirkt. DieBenutzer können allerdings auch über ein traditionelles Login Formular eingeloggt werden.

Damit ein Nutzer sich erfolgreich authentifizieren kann, braucht Symfony Informationen überden Nutzer. Dazu muss in der security.yml bestimmt werden, wie die Nutzer geladen werdensollen. Unter dem Absatz providers (s. Zeile 2) wird hinterlegt, woher die Benutzerdatengeladen werden. Hier können Benutzerdaten hart codiert reingeschrieben werden oder bei-spielsweise in einer Datenbankverbindung hinterlegt werden, damit Benutzerdaten aus derDatenbank gelesen werden.

Genauso wie bei den Firewalls kann man auch mehrere Provider angeben. Üblicherweise wirdsich dort auf einen beschränkt. Hier ein Beispiel von Symfony, in dem Benutzerdaten in dersecurtiy.yml hinterlegt wurden:

1 security:2 providers:3 in_memory:4 memory:5 users:6 ryan:7 password: ryanpass8 roles: 'ROLE_USER'9 admin:

10 password: kitten11 roles: 'ROLE_ADMIN'

Hier wurde ein in_memory Provider angelegt, das bedeutet, dass die Nutzerdaten aus dieserDatei geladen werden können. Datenbankinformationen könnten als zusätzlicher Providerangeboten werden, aber um Redundanzen zu vermeiden und die Übersichtlichkeit zu bewahren,wird sich auf einen Provider beschränkt. Wie man Nutzerdaten aus der Datenbank lädt, wirdin https://symfony.com/doc/3.4/security/entity_provider.html beschrieben.

Wenn mit dem in_memory Provider gearbeitet wird, werden Nutzerdaten geladen und in einUser Objekt zusammengefasst. In diesem Fall muss eine Passwortverschlüsselung angegebenwerden.

18 RWTH Aachen University

Page 25: Symfony – Ein PHP Webframework

4.2 Autorisierung

1 security:2 # ...3

4 encoders:5 Symfony\Component\Security\Core\User\User: plaintext6 # ...

Da die Passwörter als Text angegeben wurden, reicht die plaintext Codierung. Alternativ wirdbcrypt verwendet, um die Sicherheit zu erhöhen und die Passwörter zu verschlüsseln.

4.2 Autorisierung

Nach Abschluss der Konfiguration können Benutzer durch http_basic oder eine andere Methodeauthentifiziert werden. In diesem Teil geht es um die Zuteilung von Zugriffsrechten und Rollender Benutzer. Autorisierung im Webkontext bedeutet u.a. einem Nutzer Zutritt zu gewissenInhalten zu erlauben oder die Zustimmung von Rechten zur Ausführung von Funktionen.Beim Prozess der Autorisierung werden zwei wesentliche Schritte durchlaufen:

1. Der Benutzer wird authentifiziert und Rollen werden zugesprochen.

2. URLs, Controller oder bestimmte Funktionen werden durch Code maskiert, sodassBereiche entstehen, die nur von Nutzern mit bestimmter Rolle erreicht werden können.

Rollen sind einfache Zeichenketten in Symfony und müssen nicht an einer bestimmten Stelledefiniert werden. Rollen werden immer über den Präfix ROLE_ zugeteilt, wie im obigen Beispielhart codiert in einer security.yml zu sehen ist. Wenn eine Datenbank verwendet wird, gibtes in der Benutzer Tabelle vermutlich eine Spalte, welche die Rollen definiert.

Um den Zugriff für eine Rollengruppe zu verweigern, bzw. für speziell eine zu gewähren, istaccess_control Code in der security.yml nötig. Hier ein Beispiel, um Administrator Seitenund Funktionen vor unerlaubten Zugriff zu schützen:

1 security:2 # ...3 access_control:4 - { path: ^/admin/users, roles: ROLE_SUPER_ADMIN }5 - { path: ^/admin, roles: ROLE_ADMIN }

Unter dem Reiter access_control entsteht eine Liste, in diesem Fall von URLs, die keineGrößenbeschränkung hat. Der ^ Operator gibt an, dass nur URLs passen, die mit demnachfolgenden Muster übereinstimmen. Ohne diesen Operator in Zeile 5 würde /admin/usersals auch /users/admin als URL entsprechen, da dies ein regulärer Ausdruck ist. Mit roleswerden die Rollen beschrieben, welche auf den vorher angegeben path zugreifen dürfen. Indiesem Fall dürfen nur SUPER_ADMINS auf die users URL zugreifen, auf der zum BeispielVerwaltungsfunktionen für die Benutzer zu finden sein könnten. Wichtig bei dieser Methodeist, da Symfony die Liste der URLs von oben durchkämmt und stoppt sobald eine URLpasst, dass die URLs genau definiert werden. Bei zwei äquivalenten regulären Ausdruck wähltSymfony den ersten Eintrag, welcher in der access_control Liste zu finden ist [17].

Nachdem das Webframework Symfony umfangreich vorgestellt wurde, wird im folgendenKapitel die Frage, ob sich der Aufwand der Einarbeitung in das Webframework lohnt, erörtert.

Institut für Kommunikationssysteme 19

Page 26: Symfony – Ein PHP Webframework

4 Sicherheitsaspekte in Symfony

20 RWTH Aachen University

Page 27: Symfony – Ein PHP Webframework

Kapitel 5

Diskussion

Im Rahmen dieses Abschnitts wird das Arbeiten mit Symfony diskutiert und u.a. die Fragegestellt, warum, bzw. wann man das PHP Webframework Symfony verwenden sollte. Allge-mein sind Webframeworks nützliche Hilfsmittel mit denen teils aufwändige Entscheidungenim Vorhinein abgenommen werden. Zusätzlich sind die meisten Webframeworks, wie Sym-fony, quelloffen online verfügbar und bieten bereits eine Menge an fertig implementierterKomponenten. Auf diese kann bei der Programmierarbeit zurückgegriffen werden.

5.1 Vorteile und Stärken von Symfony

Neben den Vorteilen, die Frameworks standardmäßig liefern, hat Symfony besondere Stärken,die das Framework so einzigartig macht. Ein positiver Aspekt von Symfony ist dessen sehr hohePerformance. Besonders bei Webauftritten ist die Performance eine für Benutzer wichtige nichtfunktionale Anforderung, weil man z.B. schnell an Informationen gelangen oder seinen Einkaufim Onlineshop abschließen will. Symfonys Caching System macht dies möglich. Dadurchmüssen bereits aufgerufene Seiten nicht komplett neu geladen werden, sondern können schlichtaus dem Cache geladen werden.

Besonders für Endanwender ist Symfonys Routing System ein echter Vorteil. Damit sind klareURLs möglich, die besser zu lesen und somit einprägsamer sind. „Mittels Platzhaltern in denURLs können Parameter an die Controller übergeben werden und dort entsprechend genutztwerden“ [24].

Wie in Kapitel 4 bereits thematisiert, ist Sicherheit im Zusammenhang mit Webauftrittenein omnipräsentes Thema. Symfony bietet zahlreiche Methoden zum Blockieren von Inhaltenoder Funktionen, das Rechtesystem ist flexibel und sehr präzise. „Vor allem durch das Daten-bankmanagement und die Template-Engine werden Flüchtigkeitsfehler, welche verheerendeSicherheitslücken wie beispielsweise XSS oder SQL-Injection ermöglichen könnten, automatischausgeschlossen“ [24]. Wenn dennoch Sicherheitslücken auftreten sollten, die von Angreifernerkannt und ausgenutzt werden, steht eine große Gemeinschaft zur Verfügung, die daranarbeitet neu bekannte Probleme mit der Sicherheit zu beheben.

Eben jene Gemeinschaft ist eine große Stärke von Symfony. Diese Gemeinschaft von Webent-wicklern ist eine aktive Gruppe, welche Symfonys Komponenten entwickeln und zur freien

Institut für Kommunikationssysteme 21

Page 28: Symfony – Ein PHP Webframework

5 Diskussion

Verfügbarkeit hochladen. Wenn man Fehler im eigenen Code hat oder keinen Lösungsansatzfindet, können viele Entwickler und Programmierer beispielsweise in Foren behilflich sein. Dar-über hinaus sind Symfonys angebotene Komponenten sehr gut und verständlich dokumentiert,sodass man den Beispielcode auf Symfonys Webseiten wiederverwenden kann.

Des Weiteren bietet Symfony die Softwareversionen mit sog. long-term support Versionen an.Dies bedeutet, dass man die Software nicht regelmäßig updaten muss, sondern eine stabileVersion besitzt, die von Entwicklern hinreichend unterstützt wird. Derzeit gibt es beispielsweisedie long-term support Version 3.4 und die aktuellste Version von Symfony ist derzeit 4.2(Stand: 12.12.2018).

5.2 Nachteile

Zwar bietet Symfony long-term support für Software an, aber auch diese Softwareversion wirdirgendwann auslaufen, sodass ein Update nötig ist, um z.B. mögliche Sicherheitslücken zuschließen. Dann besteht die Gefahr, dass gewisse Methoden und Funktionen neu implementiertwerden müssen, wenn sich beispielsweise die APIs ändern. Je nachdem sind somit auch häufigerVersionskontrollen obligatorisch, um auf dem aktuellen Stand zu bleiben.

Trotz der Tatsache, dass Symfony gut dokumentiert ist, braucht es besonders für Neulinge aufdem Gebiet der Frameworks und speziell Symfony eine relativ lange Einarbeitungszeit. BeimArbeiten mit Symfony wird zum Teil bereits fertig implementierte Software genutzt. Dahermuss man sich in die Dokumentation einlesen und versuchen die Funktionen der Softwareund den Code zu verstehen. Dies setzt fakultativ voraus, dass man die Programmiersprache,bzw. die Programmiersprachen, in der das Framework programmiert ist, auch versteht undanwenden kann.

Darüber hinaus sind zusätzliche Kenntnisse in der Handhabung der Kommandozeile wichtig,da „viele der Tasks der Anwendung [...] über die Kommandozeile ausgeführt werden“ [27].Wenn zudem aus Gründen kein Zugriff auf die Kommandozeile möglich ist, ist man gezwungeneine Alternative zu finden um beispielsweise Caches zu löschen oder das Datenbankschema zuaktualisieren [27].

Zu guter Letzt stellt sich die Frage, wann oder ob ein Framework überhaupt sinnvoll fürein Projekt ist. Es könnte sein, dass ein Framework zu aufwendig für ein Projekt ist, wennes sich um ein kleineres, weniger aufwendiges Projekt handelt. Wenn man beispielsweisekaum Zeit für die Implementierung der Anforderungen benötigt, wäre das Aufsetzen einesFrameworks kontraproduktiv. Andererseits wird man sich bei sehr komplexen Aufgaben mitdem Framework Kern auseinandersetzen müssen, um eventuell die ein oder andere Möglichkeitoder Anwendung aus dem Projekt rausholen zu können.

5.3 Fazit

Nach der Diskussion über Symfony ist klar geworden, welch eine Hilfestellung Frameworks wieSymfony für Entwickler und Programmierer sein können. Es gibt natürlich auch gewichtigeNachteile, wie die lange Einarbeitungszeit und der Aufwand der betrieben werden muss, umein Framework zu verstehen und damit arbeiten zu können.

22 RWTH Aachen University

Page 29: Symfony – Ein PHP Webframework

5.3 Fazit

Im Rahmen dieser Diskussion wurde thematisiert, wann ein Framework sinnvoll in Fragekommen könnte. Sicherlich ist ein Framework sehr komplex und muss erst erlernt werden.Daher empfiehlt sich der Einsatz von Symfony nicht bei kleineren Webauftritten, besonderswenn nicht schon Vorkenntnisse zu Symfony vorhanden sind. Bei mittleren bis großen Web-Anwendungen jedoch, wird das ganze Potenzial von Symfony entfaltet.

Wenn die Einarbeitung in Symfony bereits erfolgt ist, kann man Symfonys Stärken, wie z.B.Performance und Sicherheit sehr gut nutzen. Für den Fall, dass man Symfony sehr gut kennt,könnte es sogar sein, dass kleinere Projekte mit Symfony gut zu implementieren sind. MitHilfe der guten Dokumentation sollte auch eine schnelle Einarbeitung möglich sein.

Abschließend lässt sich sagen, dass es sich tatsächlich lohnen kann, sich in das Webframeworkeinzuarbeiten, um auch bereits geschriebenen Code wiederverwenden zu können. Wenn einmalder Aufwand betrieben wurde sich einzuarbeiten, erfüllt Symfony alle Anforderungen an mittelbis große Webanwendungen und erfahrene Programmierer in Symfony würden das Frameworkvermutlich auch für kleinere Projekte nutzen.

Institut für Kommunikationssysteme 23

Page 30: Symfony – Ein PHP Webframework

5 Diskussion

24 RWTH Aachen University

Page 31: Symfony – Ein PHP Webframework

Kapitel 6

Zusammenfassung

Im Internet gibt es frei verfügbare PHP Webframeworks, die einen Rahmen mit fertigerStruktur und bereits implementierter Komponenten zur Verfügung stellen. In dieser Arbeitwurde das PHP Webframework Symfony und dessen Vorzüge vorgestellt.

Symfony ist ein Webframework, das Quellcode zum Wiederverwenden offeriert, aber selbstkeine Anwendung mit vollständiger Funktionalität ist. Bundles wie Form oder SwiftMailer sindzwei Beispiele, welche die Erstellung von Formularen, bzw. Interaktionen mit Email Kontaktermöglichen. Darüber hinaus gibt es die Doctrine Bibliothek, die Symfonys Datenmodell defi-niert und die Interaktion mit Datenbanken ermöglicht. Um eine Korrespondenz zwischen denPHP Entityklassen und den Tabellen in der Datenbank herzustellen, werden Anmerkungen inden Quellcode geschrieben. Symfonys Programmstruktur ist in die drei Komponenten Model,View und Controller unterteilt. Das Model repräsentiert die Daten der Webanwendung,welche oft in einer Datenbank abstrahiert werden. Das View sorgt für die Präsentation derDaten, welche vom Controller geliefert werden. Der Controller ist das Steuerelement derdrei Komponenten. In der View kommt Symfonys Template Sprache Twig, die vom SymfonyErfinder Fabien Potenicer entwickelt wurde, zum Einsatz.

Des Weiteren besitzt Symfony mächtige Werkzeuge, um die Sicherheit von Projekten zugewährleisten. Durch Firewalls in der security.yml werden Benutzer authentifiziert. Firewallsdefinieren auch die Methode, die verwendet wird, um sich zu authentifizieren, wie beispielsweisehttp_basic. In der security.yml werden auch Provider angegeben, die bestimmen, woherdie Benutzer geladen werden, z.B. aus einer Datenbank oder aus der gleichen Datei. DieAutorisierung zu Inhalten oder Funktionen wird auch durch die access_control Methodein der security.yml geregelt. Hier wird mit Rollen gearbeitet, sodass bestimmte Bereicheentstehen, die nur für gewisse Rollen erreichbar sind.

Zum Schluss stellt sich die Frage, inwieweit sich die Benutzung und Einarbeitung in das PHPWebframework Symfony lohnt. Zusammenfassend kann man sagen, dass Symfony wichtigeWerkzeuge bietet und Webentwickler durch Vorzüge wie Performance, gute Dokumentationund wiederverwendbaren Code unterstützt.

Institut für Kommunikationssysteme 25

Page 32: Symfony – Ein PHP Webframework

6 Zusammenfassung

26 RWTH Aachen University

Page 33: Symfony – Ein PHP Webframework

Literaturverzeichnis

[1] Application Framework. https://www.techopedia.com/definition/6005/application-framework (besucht am 08.11.2018).

[2] Beobachter Entwurfsmuster. https://de.wikipedia.org/wiki/Beobachter_(Entwurfsmuster) (besucht am 11.12.2018).

[3] Codeigniter Homepage. https://codeigniter.com/ (besucht am 06.11.2018).

[4] Codeigniter Schnelleinstieg. https://www.anexia-it.com/blog/de/schnelleinstieg-ins-codeigniter-framework/ (besucht am 06.11.2018).

[5] Codeigniter Wikipedia. https://de.wikipedia.org/wiki/CodeIgniter (besucht am06.11.2018).

[6] Datenmodel Symfony. https://t3n.de/magazin/anwendungsentwicklung-symfony-tutorial-einstieg-219978/2/ (besucht am 26.11.2018).

[7] Doctrine Symfony Doku. https://symfony.com/doc/3.4/doctrine.html (besucht am26.11.2018).

[8] Form. https://symfony.com/doc/3.4/components/form.html (besucht am21.11.2018).

[9] Framework. https://de.wikipedia.org/wiki/Framework (besucht am 06.11.2018).

[10] Komponenten Framework. https://www.clear.rice.edu/comp310/JavaResources/frameworks/ (besucht am 08.11.2018).

[11] Laravel. https://de.wikipedia.org/wiki/Laravel (besucht am 06.11.2018).

[12] Laravel. https://laravel.com/ (besucht am 06.11.2018).

[13] Model View Controller. https://de.wikipedia.org/wiki/Model_View_Controller(besucht am 09.01.2018).

[14] MVC Bild. https://blog.cloudboost.io/what-is-model-view-controller-124a9942246 (besucht am 22.11.2018).

[15] PCManufaktur. https://www.computer-manufaktur.de/php-programmierung.html(besucht am 30.11.2018).

[16] Sensiolabs. https://sensiolabs.de/ (besucht am 09.11.2018).

[17] Sicherheit. https://symfony.com/doc/3.4/security.html (besucht am 12.12.2018).

Institut für Kommunikationssysteme 27

Page 34: Symfony – Ein PHP Webframework

Literaturverzeichnis

[18] SwiftMailer. https://symfony.com/doc/3.4/email.html (besucht am 29.11.2018).

[19] Symfony Setup. https://symfony.com/doc/3.4/setup.html (besucht am 13.12.2018).

[20] Test Framework. https://de.wikipedia.org/wiki/Liste_von_Modultest-Software(besucht am 08.11.2018).

[21] Twig. https://en.wikipedia.org/wiki/Twig_(template_engine) (besucht am16.11.2018).

[22] Twig Syntax. https://symfony.com/doc/3.4/templating.html (besucht am16.11.2018).

[23] Twig Vorzüge. https://twig.symfony.com/ (besucht am 16.11.2018).

[24] Vorteile Symfony. https://www.twago.de/blog/9-grunde-fur-das-framework-symfony/ (besucht am 09.11.2018).

[25] Webframework Wikipedia. https://de.wikipedia.org/wiki/Webframework (besuchtam 06.11.2018).

[26] Webframeworks Liste. https://www.mindtwo.de/die-besten-php-frameworks/ (be-sucht am 06.11.2018).

[27] Webwokrs Nürnberg. https://wwnbg.de/2018/02/08/symfony-staerken-und-schwaechen-des-php-frameworks/ (besucht am 06.12.2018).

[28] A. Bacco. Développez votre site web avec le framework Symfony 3. Oct. 2016.

[29] F. Potencier and F. Zaninotto. The Definitive Guide to symfony. Oct. 2008.

28 RWTH Aachen University