Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Eintauchen in Symfony 2

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Valentina (you can also view the original English article)

Frameworks sind seit einiger Zeit ein heißes Thema in der Webbranche. In diesem riesigen Meer von Aromen befindet sich Symfony - ein umfangreiches PHP-Framework, das dem immer beliebten MVC-Paradigma folgt. Die Lernkurve ist wahrscheinlich etwas steiler als bei Mitbewerbern wie CodeIgniter. Keine Sorge, sobald es auf Ihnen wächst, fühlen Sie sich leistungsfähiger als je zuvor und können fantastische Anwendungen entwickeln.


1. Anforderungen

In diesem Artikel müssen Sie ein Konsolenprogramm verwenden. Ich persönlich mag Git Bash, aber jeder wird es tun. Sie müssen auch Curl installiert haben, um Composer zu installieren.

Wenn Sie ein Windows-Benutzer sind, können Sie alle oben genannten Funktionen bündeln, indem Sie Git für Windows installieren, das hier verfügbar ist: Git-Downloads.


2. Was werden Sie lernen? 

In diesem Artikel erfahren Sie mehr über:

  • Der Symfony-Anwendungsfluss
  • Installieren von Symfony 2.1 mithilfe von Composer
  • Die Symfony-Dateistruktur und die Bundles
  • Die Konsole
  • Routen und Controller
  • Antworten
  • Twig

3. Ein Symfony-Lebenszyklus

Bevor wir uns die Hände schmutzig und grob machen, möchte ich einen Moment nutzen, um den Ablauf des Symfony-Lebenszyklus zu erklären.

symfony-2-diagram

Die Anfrage

Wie alles andere im Web beginnt alles mit einer Anfrage. Dies wird von Symfony übernommen, das mit unseren definierten Routen übereinstimmt (keine Sorge, dies wird später erklärt), die dann mit Controllern abgeglichen werden. Daher teilen wir Symfony mit, welche URLs wir mit bestimmten Controllern und deren Funktionen abgleichen möchten.

Der Kernel

Hier geschieht die Magie. Symfony zerlegt die URL und ordnet sie einer unserer Routen zu. Anschließend wird der Controller geladen, den wir der Route zugewiesen haben.

Der Controller

Der Controller wird geladen und eine bestimmte Aktion wird basierend auf der Route ausgeführt.

Die Antwort

Genau wie bei einer normalen HTTP-Anforderung muss eine Symfony-Anforderung ein Antwortobjekt zurückgeben. Das Antwortobjekt kann auf verschiedene Arten gebildet werden, beispielsweise mit Überschriften. Eine Aktion muss ein gültiges Antwortobjekt zurückgeben, sonst wird eine Ausnahme ausgelöst.

Jetzt haben Sie eine kurze Einführung in die Mechanik von Symfony erhalten - jetzt ist es Zeit, sich darauf einzulassen.


4. Installation durch Composer

Eines der schönen Dinge bei der heutigen Webentwicklung sind die verfügbaren Werkzeuge zur Vereinfachung Ihres Prozesses. Einer von ihnen ist Composer - ein Paketmanager für PHP. Dieser Artikel enthält keine Details zur Verwendung von Composer. Wenn Sie jedoch interessiert sind, ist dies eine großartige Einführung: Einfache Paketverwaltung mit Composer

Wenn Sie Composer nicht global installiert haben, können Sie zunächst eine lokale Installation herunterladen, indem Sie den folgenden Befehl ausführen:

Testen Sie, ob die Installation funktioniert hat, indem Sie Folgendes eingeben:

Wenn alles reibungslos verlief, sollten Sie ein Menü mit verfügbaren Befehlen sehen. Wenn nicht, überprüfen Sie, ob Sie PHP in Ihren Umgebungsvariablen eingerichtet haben.

Nun fahren wir mit der Installation von Symfony fort. Ersetzen Sie your-folder durch den gewünschten Ordnernamen für Ihr Projekt. Sie können die Version am Ende auch durch eine beliebige ersetzen. Ich empfehle, Packagist: Symfony Framework Standard Edition auf die neueste stabile Version zu überprüfen.

Sie sollten jetzt sehen, wie Composer Abhängigkeiten in den Ordner herunterlädt. Wenn Ihre Installation gut verlaufen ist, gehen Sie zu your-project.local/web/config.php - hier informiert Sie Symfony über fehlende Serveranforderungen oder optionale Erweiterungen, die die Leistung steigern oder Ihre Entwicklung vereinfachen könnten.

Wenn Sie die erforderlichen und optionalen Erweiterungen aktiviert haben, gehen Sie zu /web/app_dev.php. Dort sollte ein Begrüßungsbildschirm mit Links für verschiedene Lernerfahrungen angezeigt werden. Dies bedeutet, dass Symfony erfolgreich installiert wurde - Glückwunsch!


5. Einführung in die Symfony-Dateistruktur und die Bundles

Auf den ersten Blick scheint Ihr Stammordner etwas verwirrend zu sein. Keine Sorge, hinter der Struktur steckt eine logische Erklärung. Ihr Stamm sollte aus diesen vier Ordnern und einigen Dateien bestehen. Sie können die Dateien ignorieren, da sie momentan nicht wichtig sind.

Das App-Verzeichnis

Hier setzt die allgemeine Konfiguration Ihres Projekts an. Dies ist beispielsweise die Heimat der AppKernel-Klasse, die Ihren gesamten Code und Bibliotheken von Drittanbietern in das Framework für Ihre Verwendung lädt.

Das app-Verzeichnis enthält auch alle Hauptkonfigurationsdateien, die Informationen zur Datenbankanmeldung, zu Sicherheitsmodellen, zum Routing und vielem mehr enthalten.

Hier befindet sich auch Ihr Basis-HTML-Layout.

Das Src-Verzeichnis

Das src-Verzeichnis ist die Heimat Ihres gesamten Codes, der in Bundles gruppiert ist.

Wer oder was ist ein Bundle?

Der gesamte Symfony-Code wird logisch in so genannten Bundles gruppiert. Angenommen, Ihr Projekt verfügt über ein Benutzersystem, dann wären alle Ihre benutzerorientierten Controller, CSS, JavaScript, Datenbankentitäten usw. in einem UserBundle enthalten. Das Besondere an diesem System ist, dass Sie ein Bundle (z. B. ein Benutzerverwaltungs-Bundle) in jedes Symfony-Projekt einbinden können.

Sie können sogar gebrauchsfertige Bundles von Websites wie KNP Bundles herunterladen. Zu den beliebtesten Optionen gehören Benutzersystem-Bundles und Administrations-CRUD-Generator-Bundles. Zum Zeitpunkt des Schreibens dieses Artikels hat die Site 1779 Bundles und 4068 Entwickler.

Das Lieferantenverzeichnis

Hier speichern wir alle Bibliotheken von Drittanbietern. Dies ist bereits voll mit Bibliotheken, zum Beispiel Symfony, Doctrine, Assetic und mehr.

Das Webverzeichnis

Dies sollte das Stammverzeichnis Ihrer Domain sein, da dies das einzige öffentlich zugängliche Verzeichnis Ihres Projekts ist. Dies ist die Heimat Ihrer Front-Controller-Dateien app.php und app_dev.php, die die beiden öffentlichen Zugriffspunkte auf Ihre Anwendung sind. Ein Benutzer wird Ihre Website über eine URL wie /app.php/products/jeans aufrufen.

  • app_dev.php ist der Haupteinstiegspunkt bei der Entwicklung Ihrer App. Wenn Sie dies als Einstiegspunkt verwenden, überspringt Symfony das Caching und stellt Ihnen eine beeindruckende Entwicklungssymbolleiste zur Verfügung.
  • app.php ist der Einstiegspunkt für den Produktionsmodus. Dies wird durch mod_rewrite optional gemacht, sodass die URLs /app.php/products/jeans und /products/jeans tatsächlich beide auf denselben Speicherort verweisen.

6. Codieren mit der Konsole… Warten Sie, was?

Die Konsole hat sich in meinem Entwicklungsprozess als brillantes Werkzeug erwiesen, und deshalb sage ich Ihr: Sie sollen Ihre Konsole nicht fürchten, denn Sie sind der Schöpfer aller Dinge.

Für mich war eines der (wunderbar) seltsamen Dinge bei der Umstellung auf Symfony die starke Nutzung der Konsole.

Lassen Sie uns einfach gleich darauf eingehen. Öffnen Sie Ihre Konsole und suchen Sie das Projektstammverzeichnis. Geben Sie diesen Befehl ein:

Dies sind die Befehle, die Ihnen zur Verfügung stehen. Meistens verwenden Sie die Generatoren, den Cache und das Asset Management. Sie werden dies auch verwenden, um Bundles zu generieren, Datenbankschemata zu generieren, Routen zu debuggen, den Cache zu löschen und vieles mehr.


7. Genug der Worte. Ich möchte Code!

Mit einigen Grundkenntnissen über die Struktur und die Konsole können Sie jetzt in Symfony eintauchen!

Gehen Sie zu app_dev.php. Der Begrüßungsbildschirm, den Sie hier sehen, ist eigentlich ein Bundle, wie wir es in einer Minute erstellen werden. Gehen Sie zu src/ und löschen Sie das Verzeichnis Acme. Wenn Sie die Seite aktualisieren, wird ein Fehler angezeigt. Dies liegt daran, dass die AppKernel-Klasse versucht, das gerade gelöschte Bundle zu laden. Wann immer Sie ein Bundle hinzufügen oder entfernen, müssen Sie die AppKernel-Klasse bearbeiten.

Öffnen Sie also app/AppKernel.php. Sie sehen ein Array wie das folgende:

Hier initialisieren Sie neue Bundles. Wenn Sie ein Bundle über die Konsole erstellen, wird es automatisch hinzugefügt.

Weiter unten sollten Sie einen if-Block wie diesen sehen:

Dies sind Entwicklungspakete, d. h. Bundles, die nur geladen werden, wenn Sie sich in der Entwicklungsumgebung befinden (app_dev.php). Sie werden sehen, dass hier unser gelöschtes Bundle initialisiert wird. Entfernen Sie die AcmeDemoBundle-Zeile und speichern Sie die Datei.

Wenn Sie aktualisieren, wird jetzt die Symfony-Ausnahmeseite angezeigt. Hier leiten Sie alle abgefangenen Ausnahmen weiter und zeigen weitere Informationen an. Sie werden eine Ausnahme sehen, die ungefähr so aussieht:

Dies liegt daran, dass Symfony in der Controller-Datei SecuredController.php (die im gelöschten AcmeDemoBundle enthalten war) nach definierten Routen sucht.

Was ist eine Route?

Jetzt ist wahrscheinlich ein guter Zeitpunkt, um ein bisschen mehr über Routen zu erklären. Grundsätzlich ist eine Route eine URL-Vorlage. Stellen Sie sich vor, Sie haben ein Blog mit Beiträgen nach verschiedenen Kategorien. Sie möchten also, dass der Benutzer eine URL wie folgt eingibt:

In Symfony können Sie URL-Vorlagen definieren, die Sie einem Controller zuordnen. Stellen Sie sich das vorherige Beispiel vor. Sie benötigen eine Funktion, die den Kategorienamen erhält und damit nach Blog-Posts sucht. In einer MVC-Anwendung und daher in Symfony ist diese Funktion in einen Controller eingebunden. Es würde also im Grunde so aussehen:

Hinweis: Dies ist kein gültiger Symfony-Code, sondern nur ein Beispiel für einen einfachen Blog-Controller.

Jetzt müssen Sie nur noch die Controller-Aktion und die URL miteinander verknüpfen. Dies erfolgt über Routen. Die Route würde in diesem Fall folgendermaßen aussehen:

Wenn eine Zeichenfolge in geschweiften Klammern geschrieben wird, wird sie als Variable interpretiert, die dann an die angegebene Aktion übergeben wird. In Symfony können Sie Routen in XML, YML oder durch Anmerkungen definieren. Um es einfach zu halten, werden wir in diesem Tutorial nur Anmerkungen verwenden.

Sie können alle definierten Routen mit dem folgenden Befehl in der Konsole anzeigen:

Aber denken Sie daran, wir hatten einen Fehler. Dies liegt daran, dass Symfony in unserem AcmeDemoBundle-Controller (der nicht vorhanden ist) immer noch nach den definierten Routen sucht. Öffnen Sie also app/config/routing_dev.yml und im Moment müssen Sie nur wissen, dass alle Routen in routing.yml und routing_dev.yml definiert oder importiert werden. Löschen Sie die Schlüssel _demo, _welcome und _demo_secured. Wenn Sie aktualisieren, wird jetzt Keine Route für "GET/" gefunden. Dies liegt daran, dass es keine Routen gibt, die mit der aktuellen URL übereinstimmen. Erstellen wir also eine Route, die dies tut.

Aber zuerst ein Controller

Wenn Sie Routen als Anmerkungen schreiben, schreiben Sie sie direkt über die Aktion, die Sie ausführen möchten, wenn ein Benutzer die angegebene Route eingibt. Daher brauchen wir jetzt ein Bündel, das unseren Controller und unsere Aktion enthält.

Öffnen Sie Ihre Konsole und geben Sie den folgenden Befehl ein:

Zunächst müssen Sie den Namespace Ihres Bundles eingeben. Die allgemeine Vorlage hierfür lautet:

Der Anbieter ist der Autor des Bundles. Hier können Sie Ihren Firmennamen oder was auch immer Sie möchten eingeben. Ich benutze gerne meine Initialen EP. Verwenden Sie, was Sie möchten, aber halten Sie es kurz.

Der Name des Bundles muss mit Bundle enden. Ich werde also Folgendes eingeben:

Als Nächstes können Sie den Namen auswählen, den Sie zur Identifizierung des Bundles in Ihrem Code verwenden möchten. Normalerweise lasse ich den Namen des Anbieters weg, aber für dieses Tutorial drücken Sie einfach die Eingabetaste. Der Generator enthält weitere Schritte, aber Sie möchten die Standardwerte für dieses Tutorial. Drücken Sie einfach die Eingabetaste, bis Sie fertig sind.

Öffnen Sie nun src/YourVendorName/BlogBundle/ in Ihrem Editor. Sie werden sehen, dass eine grundlegende Bundle-Struktur für Sie erstellt wurde. Im Moment überspringen wir die Details und gehen direkt zum Controller-Verzeichnis. Öffnen Sie DefaultController.php in controller/.

Dies ähnelt stark dem grundlegenden Beispiel, das ich zuvor geschrieben habe, außer dass der Controller eine Ableitung von Controller ist - einer Klasse aus dem Symfony-Framework-Bundle, die die grundlegenden Funktionen für einen Controller enthält.

Wenn Sie sich die Aktion ansehen, werden Sie einige Anmerkungen bemerken, die folgendermaßen aussehen:

Die Annotation @Route teilt Symfony mit, dass die Route / hello/{name} mit der Aktion \EP\BlogBundle\Controller\DefaultController::indexAction() abgeglichen werden soll und dass die URL eine Variable namens name enthält. Wenn also jemand ähnliche URLs eingibt:

... sie werden alle an den gleichen Ort gehen, weil sie alle mit der Route /hello/{name} abgeglichen werden.

Die Annotation @Template teilt Symfony mit, welche Ansicht verwendet werden soll. Wenn Symfony leer gelassen wird, wird anhand des Controllernamens und des Aktionsnamens erraten, welche Ansicht verwendet werden soll.

Sollten jedoch nicht alle Aktionen ein gültiges Antwortobjekt zurückgeben?

Der Beobachter Padawan wird inzwischen bemerkt haben, dass es in dieser Aktion kein zurückgegebenes Antwortobjekt gibt, von dem ich behauptete, dass es eine Anforderung früher in diesem Artikel war.

Eine Antwort ist ein Objekt, das den anzuzeigenden Code, Service-Codes, Header usw. enthält. Wenn Sie beispielsweise eine "Hallo Welt" -Seite anzeigen möchten, gehen Sie wie folgt vor:

Wenn Sie eine Seite für einen AJAX-Aufruf erstellen möchten, gehen Sie folgendermaßen vor:

Wenn Sie den Benutzer umleiten möchten, können Sie dies mit einem RedirectResponse-Objekt tun.

Hinweis: Sie können Ihre Antwort jederzeit an Ihre Bedürfnisse anpassen - Statuscodes, Überschriften und mehr. Nichts ist verboten.

Wenn Sie dem Benutzer eine Ansicht rendern möchten, geben Sie normalerweise ein neues Antwortobjekt wie folgt zurück:

Dies ist eine lange Verknüpfung, die ein Antwortobjekt mit einer gerenderten Vorlage als Inhalt zurückgibt. Glücklicherweise hat die Basis-Controller-Klasse, von der unser Controller ausgeht, viele raffinierte Verknüpfungsfunktionen. Wir können die render()-Methode verwenden, um Zeit zu sparen:

Dies ist nur eine Abkürzung zu der ersten Methode, die ich oben gezeigt habe. Der erste Parameter ist die zu rendernde Ansicht. Alle unsere Ansichten befinden sich in unserem Paket unter Resources/views/. Die Ansichten werden basierend auf dem für die Ansicht verantwortlichen Controller in Verzeichnisse unterteilt. Daher die Namenskonvention Bundle:Controller:View.

Ihre Basislayoutansicht (die Hauptvorlage Ihrer Anwendung) befindet sich in app/Resources/views/. Da sich dies weder in einem Bundle- noch in einem Controller-Verzeichnis befindet, wird es einfach als ::base.html.twig bezeichnet. Eine Ansicht in Ihrem Bundle, die sich im Stammverzeichnis für Bundle-Ansichten befindet, wird als Bundle::View bezeichnet.

Und schließlich sind die Variablen, auf die wir in unserer Ansicht zugreifen möchten, der zweite Parameter unserer render()-Funktion.

Vorlage mit Twig

Twig ist eine Template-Engine, die von Sensiolabs - den Entwicklern von Symfony - entwickelt wurde. Symfony wird mit Twig geliefert, muss jedoch nicht verwendet werden.

Twig bietet viele nette Funktionen, die den Rahmen dieses Artikels sprengen. Sie können sie jedoch auch auf der offiziellen Twig-Website nachlesen.

Wenn Sie EPBlogBundle:Default:index.html.twig öffnen, wird Code angezeigt, der folgendermaßen aussieht:

Twig verwendet {{ }} und {% %} als Start- und End-Tags. Doppelte geschweifte Klammern bedeuten, etwas auszugeben, ähnlich dem PHP-Äquivalent von  {{ name }} bedeutet also, den Wert unserer Variablen $name auszugeben (den wir Symfony mitgeteilt haben, den wir beim Erstellen unseres Antwortobjekts verwenden wollten).

Um Ihnen eine kleine Auswahl von Twigs Großartigkeit zu geben, zeige ich Ihnen einige Filter. Ein Filter ist eine Funktion, die Sie auf eine Variable anwenden können. Es wird mit dieser Syntax {{ var|filter }} angewendet. Hier sind einige Beispiele.

Eine vollständige Liste der Tags, Filter und Funktionen finden Sie in der offiziellen Twig-Dokumentation. Was Twig wirklich großartig macht, ist, dass es sehr einfach ist, eigene Filter und Funktionen zu erstellen. Sie müssen jedoch auf ein weiteres Tutorial warten, um weitere Informationen zu Twig und seiner Erweiterbarkeit zu erhalten.


Abschluss

Dies ist das Ende unserer großartigen Reise - und was für ein Abenteuer!

Wir haben nicht nur die Struktur von Symfony und Bundles kennengelernt, sondern auch die Macht von Routen und ihren Controllern. Wenn Sie dies mit etwas Twig bestreuen, wurde Symfony vorgestellt! Ich werde in Kürze mit ausführlicheren Tutorials zu spezifischeren Themen wie Asset Management mit Assetic und Templating mit Twig zurückkehren. Danke fürs Lesen.

Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.