Symfony Teil 2: Scaffolding mit der Kommandozeile

Erste Erfahrungen mit Symfony

symfony_my_albums_nevermind

Nachdem die Entscheidung, welches PHP-Framework ich einsetzen möchte, auf Symfony fiel, möchte ich nun erste Erfahrungen damit machen. Dazu will ich die Musikalbenverwaltung aus dem Zend-Tutorial mit Symfony umsetzen. Das Ergebnis stelle ich über Github bereit: https://github.com/bjoerne2/symfony-myalbums.

symfony_my_albums_zend

Ich installiere zunächst das Tool Composer, um damit ein Symfony-Projekt anzulegen. Das mache ich wie in dessen Installationsanleitung für UNIX-Systeme (in meinem Fall OSX) unter Globally beschrieben.

Anschließend führe ich in meinem htdocs-Verzeichnis den folgenden Befehl aus, um ein Projekt symfony-myalbums anzulegen:

composer create-project symfony/framework-standard-edition symfony-myalbums/ 2.3.1

Die Ausführung dauert eine Weile. Nachdem ich dem Webserver-User Schreibrechte für das symfony-myalbums-Verzeichnis und alle Unterverzeichnisse gegeben habe, kann ich http://localhost/symfony-myalbums/web/app_dev.php aufrufen. Welcome! heißt es auf der generierten Startseite.

Da ich meine erste Artefakte gerne mit der Kommandozeile erstellen möchte (Scaffolding à la Ruby n Rails), schaue ich mir das Kapitel SensioGeneratorBundle in der Dokumentation an.

Bundle generieren

Als erstes erzeuge ich ein neues Bundle mit

php app/console generate:bundle

Es startet ein Assistent, der mir ein paar Fragen stellt. Zunächst werde ich nach dem Bundle namespace gefragt. Es wird eine Eingabe in der Form <Vendor><Name des Bundle>Bundle erwartet, beispielsweise BjoerneMyAlbumsBundle.

Als Konfigurationsformat wähle ich yml, damit bin ich bei Ruby on Rails gut gefahren. Die Frage Do you want to generate the whole directory structure beantworte ich mit yes. Alle anderen Fragen beantworte durch Drücken der Enter-Taste (= Default-Wert wird übernommen).

Ich speichere das Projekt in git. Daher kann ich mit git diff genau sehen, welche Codestellen geändert wurden: In app/AppKernel.php wurde das Bundle registriert und in app/config/routing.yml wurde die Routing-Konfiguration des Bundles eingetragen. In src wurde das Bundle angelegt.

Über die URL http://localhost/symfony-myalbums/web/app_dev.php/hello/bjoerne werde ich nun freundlich, wenn auch grafisch nicht sehr ansprechend, begrüßt.

Model generieren

Als nächstes generiere ich einen Doctrine Entity Stub:

php app/console generate:doctrine:entity

Als Entity shortcut name wähle ich BjoerneMyAlbumsBundle:Album. Das Format bestätige ich mit Enter (Default-Format annotation).

Nun lege ich nacheinander die Entity-Felder analog zu denen der Zend-Applikation an:

New field name (press <return> to stop adding fields): artist
Field type [string]: 
Field length [255]: 100

New field name (press <return> to stop adding fields): title
Field type [string]: 
Field length [255]: 100

Eine leere Repository-Klasse lasse ich auch anlegen, auch wenn ich noch nicht weiß, was das ist.

Um die Datenbanktabellen anzulegen, genügt der folgende Aufruf, wie in der Symfony-Dokumentation zu Doctrine beschrieben:

php app/console doctrine:schema:update --force

CRUD-Controller generieren

Als nächstes generiere ich einen CRUD-Controller für die erstellte Entity. Nicht zu verwechseln mit dem "normalen" Controller, den man auch generieren lassen kann.

php app/console generate:doctrine:crud

Ich lasse write-Actions erstellen und bestätige alle anderen Fragen mit Enter.

Was mich erfreut: Nicht nur der Controller sondern auch eine Testklasse wird angelegt. Es fehlt allerdings noch das Routing. Die Annotations wurden zwar generiert, werden aber noch nicht ausgewertet. Ich füge in der Datei <htdocs>/symfony-myalbums/src/Bjoerne/MyAlbumsBundle/Resources/config/routing.yml Folgendes hinzu

my_albums_controller:
    resource: "@BjoerneMyAlbumsBundle/Controller"
    type:     annotation

Anschließend kann ich auf http://localhost/symfony-myalbums/web/app_dev.php/album/ meine Musikalben verwalten.

Zwischenfazit und weiteres Vorgehen

Die Generierung hat super geklappt. Die Aufrufe und Interaktion auf der Kommandozeile waren intuitiv und die Dokumentation war hilfreich.

Als nächstes möchte ich aber noch einen Schritt weitergehen und der Mini-Anwendung ein besseres Aussehen verpassen.

 

bjoerne_com_bjoern_weinbrenner_softwareentwickler_icon_leistungen_02

Lust auf mehr? Als PHP-Entwickler und Softwarearchitekt kann ich Sie in Ihren Projekten unterstützen. Melden Sie sich gerne bei mir.

2017-01-28T14:29:54+00:00 10.09.2013|Tags: , , , , |6 Comments

6 Kommentare

  1. Julius 5. November 2013 um 16:02 Uhr- Antworten

    Hallo Björn,

    sehr interessanter Artikel. Nachdem ich jetzt, der Reihenfolge entsprechend, mit CodeIgniter und CakePHP gearbeitet habe und nun Laravel nutze, wollte ich mir, vorallem aufgrund der sehr starken Anlehnung/Einbindung von Laravel an Symfony mal Symfony ansich anschauen. Danke für diesen Beitrag, der einen schnellen Start sicher erleichert.

    Ich selbst bin allerdings immer noch hin- und hergerissen zwischen den Frameworks. CodeIgniter ist perfekt für einfache und schnelle Anwendungen, CakePHP hingegen hat selbst ein sehr gutes Scaffolding per CLI und ist super für Prototyping geeignet. Laravel vereint diese beiden Eigenschaften ein bisschen und kann mit einer guten CLI sowie Composer und Symfony-Bundle Support punkten. Letztendlich läuft wohl alles auf Symfony hinaus 🙂

    Guter Artikel, gerne mehr davon.

    • Björn Weinbrenner 5. November 2013 um 16:17 Uhr- Antworten

      Hallo Julius!
      Vielen Dank für das Kompliment!
      Wenn du weitere Erfahrungen gesammelt hast, darfst du die gerne hier teilen. Würde mich sehr freuen.
      Viele Grüße
      Björn

  2. Björn Weinbrenner 9. Dezember 2013 um 7:05 Uhr- Antworten

    Unter OSX Mavericks (10.9) habe ich eine Fehlermeldung bekommen, wenn ich php app/console doctrine:schema:update --force ausgeführt habe:
    [PDOException]
    SQLSTATE[HY000] [2002] No such file or directory

    Die Lösung habe ich hier gefunden:
    http://www.coolestguidesontheplanet.com/downtown/get-apache-mysql-php-and-phpmyadmin-working-osx-109-mavericks
    In meinem Fall (mit ZendServer) musste ich folgenden Befehl ausführen:
    sudo ln -s /usr/local/zend/mysql/tmp/mysql.sock /var/mysql/mysql.sock

  3. Ronny 11. Dezember 2013 um 8:53 Uhr- Antworten

    Danke für das tolle Tutorial! Ich hab auch überlegt, was man an FW für Kleinprojekte einsetzen kann, und bin auch bei Symfony gelandet (Zend ist too big). Dein Blogpost wird den Einstieg beschleunigen.

  4. manu 8. April 2015 um 15:07 Uhr- Antworten

    Hi,

    ich habe das tutorial gefunden, da ich mich in das symfony framework einarbeiten möchte.

    Leider bekomme ich die Fehlermeldung:
    Circular reference detected in "/var/www/public/page/app/config/routing_dev.yml"

    Läuft in einer vagrant box.

Hinterlassen Sie einen Kommentar