WebBuilder von Host Europe

Symfony Framework Tutorial

Moderne Web-Programmierung mit dem Symfony Framework
In diesem Tutorial wollen wir die grundlegenden Möglichkeiten des PHP Frameworks "symfony" erläutern.
Symfony ist ein in PHP 5 geschriebenes quelloffenes Web Application Framework welches dem Model View Controller (MVC) Architekturmuster folgt.

Für die Arbeit mit dem Symfony Framework verwenden wir ein Linux Betriebssystem inklusive Apache Webserver mit PHP Integration sowie eine MySQL Datenbank.

Wir gehen davon aus, dass das Symfony Framework heruntergeladen und in
/home/john/workspace/projekt1/lib/vendor ausgepackt vorliegt.

1. Neues Projekt anlegen

Wir legen eine neues Projekt an und zusätzlich gleich ein Frontend.
Symfony erzeugt hierzu die entsprechenden Dateien für die Webseitenansicht.

cd /home/john/workspace/projekt1
php lib/vendor/symfony/data/bin/symfony generate:project projektname
php symfony generate:app frontend

 

2. Apache Seite anlegen

Neue Apache Seite für das Projekt einrichten.

Datei: /etc/apache2/sites-available/projekt1
<VirtualHost *:80>
  ServerName projekt1.localhost
  DocumentRoot "/home/john/workspace/projekt1/web"
  DirectoryIndex index.php

  <Directory "/home/john/workspace/projekt1/web">
    AllowOverride All
    Allow from All
  </Directory>

  Alias /sf /home/john/workspace/projekt1/lib/vendor/symfony/data/web/sf

  <Directory "/home/john/workspace/projekt1/lib/vendor/symfony/data/web/sf">
    AllowOverride All
    Allow from All
  </Directory>
</VirtualHost>

Die Seite aktivieren
a2ensite projekt1

Damit der Servername projekt1.localhost aufgelöst werden kann sollte man entsprechend den DNS Server oder die hosts Datei konfigurieren!

Symfony sollte jetzt unter [http://projekt1.localhost] erreichbar sein!

3. Ein [Daten]Modell anlegen

Das Datenmodell wird im yaml-Format in der Datei config/doctrine/schema.yml definiert.

Zur Verwendung des YAML Dateiformats gilt folgende Regel:
1. Keine Tabulatoren verwenden
2. Mindestens 2 Leerzeichen als Einrückung verwenden

Beispiel aus dem Practial Symphony
# config/doctrine/schema.yml
JobeetCategory:
  actAs: { Timestampable: ~ }
  columns:
    name: { type: string(255), notnull: true, unique: true }
 
JobeetJob:
  actAs: { Timestampable: ~ }
  columns:
    category_id:  { type: integer, notnull: true }
    logo:         { type: string(255) }
    url:          { type: string(255) }
    position:     { type: string(255), notnull: true }
    how_to_apply: { type: string(4000), notnull: true }
    token:        { type: string(255), notnull: true, unique: true }
    is_public:    { type: boolean, notnull: true, default: 1 }
    is_activated: { type: boolean, notnull: true, default: 0 }
    expires_at:   { type: timestamp, notnull: true }
  relations:
    JobeetCategory: { onDelete: CASCADE, local: category_id, foreign: id, foreignAlias: JobeetJobs } 

Siehe http://www.symfony-project.org/jobeet/1_4/Doctrine/en/03

Die Anweisung actAs: { Timestampable: ~ }  erzeugt in der Tabelle die Spalten
     created_at datetime 
     updated_at datetime 

Somit wird bei Anlage und bei jeder Änderung des Datensatzes ein Zeitstempel automatisch eingefügt.

Datenbank Verbindungsstring einrichten
php symfony configure:database "mysql:host=localhost;dbname=projekt1" root kennwort

Datenbank erzeugen
php symfony doctrine:build --all

4. Testdaten

Testdaten können in data/fixtures/ angelegt werden.
Alle Dateien die sich hier befinden, werden später abgearbeitet.

Beispiele gibt es hier: http://www.symfony-project.org/jobeet/1_4/Doctrine/en/03

Nachdem die Testdaten eingegeben wurden, können diese geladen werden mit:

php symfony doctrine:build --all --and-load

5. Module

Ein einfaches Modul ohne Datenbankanbindung erzeugt man mit:

php symfony generate:module frontend modulname

Will man ein Modul mit Doctrine Zugriff auf eine Tabelle herstellen dann ist folgendes zu tun.

Beispiel:
Tabelle: Tabelle1
Modulname: tab

Parameter --with-show erzeugt die Methode show
php symfony doctrine:generate-module --with-show frontend tab Tabelle1

Es muss jetzt noch eine Route in apps/frontend/config/routeing.yml angelegt werden.
Für den Anfang reicht erst mal eine DoctrineCollection. Siehe 9.Routing.

# apps/frontend/config/routeing.yml 
tab:
  class:   sfDoctrineRouteCollection
  options: { model: Tabelle1 }

Jetzt sollte unter http://projekt1.localhost/frontend_dev.php/tab die Tabelle angezeigt werden!

6. Default Layout

Die Datei apps/frontend/templates/layout.php öffnen.
Hier wir das default Layout eingestellt.

Wichtig ist die Ausgabe des Contents
<?php echo $sf_content ?>

Bilder, CSS und JavaScript Dateien packt man am Besten die entsprechenden Unterordner unter web/
- web/css
- web/images
- web/js

7. CSS

In der Datei frontend/config/view.yml können die Texte für die Ausgabe des Titels, Keywords, Language, etc... vorgenommen werden. CSS Dateien die sich im Ordner web/css/ befinden können mit Komma getrennt eingebunden werden.

frontend/config/view.yml
   stylesheets:    [reset-fonts-grids.css, main.css]

Will man CSS Dateien separat für ein Modul einbinden, so muss man unter config/modules/<Modulname>/templates/ eine neue Datei view.yml anlegen. In dieser Datei kann man dann, für die einzelnen Modulausgaben, CSS Dateien einbinden.

Beispiel:
indexSuccess:
  stylesheets: [modul-liste.css]
 
showSuccess:
  stylesheets: [modul-anzeigen.css]

Alternative
// direktes Einbinden von CSS-Dateien in Template Dateien
<?php use_stylesheet('modul-liste.css') ?>

8. Wo findet man was?

Jedes Modul hat im Ordner apps/frontend/modules einen entsprechenden Unterordner für das angelegt Modul.

Modulname
 |_ actions CONTROLLER
   -> actions.class.php
 |_ lib Zuästzliche Klassen, z.B. für Formulare
 |_ templates  VIEWS
   -> _form.php
   -> editSuccess.php
   -> indexSuccess.php
   -> newSuccess.php
   -> showSuccess.php

Die YAML Konfigurationsdateien befinden sich in apps/frontend/config/*.yml

rouing.yml ist für das URL Rewrite.
view.yml ist für das Einbinden von CSS, JS und das befüllen der Slots.
security.yml wird später dazu verwendet, zu steuern welche Seiten einen Login benötigen.

Das Standard Layout des Projekts ist in der Datei apps/frontend/templates/layout.php hinterlegt.

9. Routing

Im Prinzip sollte ist es immer eine gute Vorgehensweise, eine neue Seite mit einem Routing zu beginnen

Beispiel:

modul_new_user:   
      url:     /modul/neuen-datensatz-anlegen
      class:   sfDoctrineRoute
      options: { module: mod1, action: newUser }

In dem oben gezeigten Beispiel wird eine Route angelegt mit Namen "modul_new_user". Diese Route startet die Action "newUser" aus dem Module "mod1"

Einen Link auf diese Route setzt man in einem Template Beispielsweise so:

<a href='<?php echo url_for("modul_new_user") ?>'>Neuer Datensatz</a>

Kommentar hinzufügen

Dein Name:
Betreff:
Kommentar: