Development

Documentation/de_DE/book/1.0/02-Exploring-Symfony-s-Code (diff)

You must first sign up to be able to contribute.

Changes between Version 5 and Version 6 of Documentation/de_DE/book/1.0/02-Exploring-Symfony-s-Code

Show
Ignore:
Author:
Erik.Dahne (IP: 88.134.102.27)
Timestamp:
07/30/07 18:25:47 (10 years ago)
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/de_DE/book/1.0/02-Exploring-Symfony-s-Code

    v5 v6  
    3030#### Flache Programmierung 
    3131 
    32 In einer "flachen" PHP-Datei könnte das Darstellen einer Liste von Datenbankeinträgen wie das Skript im Listing 2-1 aussehen. 
    33  
    34 Listing 2-1 - Ein flaches PHP-Skript 
     32In einer "flachen" PHP-Datei könnte das Darstellen einer Liste von Datenbankeinträgen wie das Skript im Codeabschnitt 2-1 aussehen. 
     33 
     34Codeabschnitt 2-1 - Ein flaches PHP-Skript 
    3535 
    3636    [php] 
    8383#### Die Darstellung isolieren 
    8484 
    85 Die Aufrufe von `echo` und `printf` im Listing 2-1 machen den Quelltext schwer lesbar. Eine Änderung des HTML-Codes zur Verbesserung der Darstellung bereitet in dem momentanen Skript Schwierigkeiten. Der Quelltext kann in zwei Teile gegliedert werden. Der reine PHP-Code mit der Geschäftslogik wandert in ein Steuerungsskript, wie z.B. im Listing 2-2. 
    86  
    87 Listing 2-2 - Der Steuerungsteil, in `index.php` 
     85Die Aufrufe von `echo` und `printf` im Codeabschnitt 2-1 machen den Quelltext schwer lesbar. Eine Änderung des HTML-Codes zur Verbesserung der Darstellung bereitet in dem momentanen Skript Schwierigkeiten. Der Quelltext kann in zwei Teile gegliedert werden. Der reine PHP-Code mit der Geschäftslogik wandert in ein Steuerungsskript, wie z.B. im Codeabschnitt 2-2. 
     86 
     87Codeabschnitt 2-2 - Der Steuerungsteil, in `index.php` 
    8888 
    8989    [php] 
    113113 
    114114          
    115 Der HTML-Code, der eine Template-ähnliche PHP-Syntax enthält, wird in einem Skript zur Darstellung wie in Listing 2-3 abgespeichert. 
     115Der HTML-Code, der eine Template-ähnliche PHP-Syntax enthält, wird in einem Skript zur Darstellung wie in Codeabschnitt 2-3 abgespeichert. 
    116116          
    117117 
    118 Listing 2-3 - Die Darstellung, in `view.php` 
     118Codeabschnitt 2-3 - Die Darstellung, in `view.php` 
    119119 
    120120    [php] 
    143143#### Die Datenschicht isolieren 
    144144 
    145 Der Großteil des Steuerungsskripts dient der Datenmanipulation. Was würden Sie jedoch tun, wenn Sie die Liste der Beiträge in einem anderen Steuerungsskript benötigen, z.B. eines, das einen RSS-Feed der Weblog-Beiträge ausgibt? Was würden Sie tun, wenn Sie alle Datenbankabfragen an einer Stelle haben wollen, um doppelten Quelltext zu vermeiden? Was würden Sie tun, wenn Sie sich entscheiden das Datenmodell so zu ändern, dass die Tabelle `post` in `weblog_post` umbenannt wird? Was würden Sie tun, wenn Sie statt MySQL PostgreSQL einsetzen möchten? Um all diese Änderungen zu ermöglichen, müssen Sie den Quelltext zur Datenmanipulation aus dem Steuerungsskript entfernen und in einem separaten Skript, dem Datenmodell, zusammenfassen, wie im Listing 2-4. 
    146  
    147 Listing 2-4 - Das Datenmodell, in `model.php` 
     145Der Großteil des Steuerungsskripts dient der Datenmanipulation. Was würden Sie jedoch tun, wenn Sie die Liste der Beiträge in einem anderen Steuerungsskript benötigen, z.B. eines, das einen RSS-Feed der Weblog-Beiträge ausgibt? Was würden Sie tun, wenn Sie alle Datenbankabfragen an einer Stelle haben wollen, um doppelten Quelltext zu vermeiden? Was würden Sie tun, wenn Sie sich entscheiden das Datenmodell so zu ändern, dass die Tabelle `post` in `weblog_post` umbenannt wird? Was würden Sie tun, wenn Sie statt MySQL PostgreSQL einsetzen möchten? Um all diese Änderungen zu ermöglichen, müssen Sie den Quelltext zur Datenmanipulation aus dem Steuerungsskript entfernen und in einem separaten Skript, dem Datenmodell, zusammenfassen, wie im Codeabschnitt 2-4. 
     146 
     147Codeabschnitt 2-4 - Das Datenmodell, in `model.php` 
    148148 
    149149    [php] 
    174174    ?> 
    175175 
    176 Das überarbeitete Steuerungsskript ist im Listing 2-5 dargestellt.     
    177          
    178 Listing 2-5 - The Steuerung, überarbeitet, in `index.php` 
     176Das überarbeitete Steuerungsskript ist im Codeabschnitt 2-5 dargestellt.       
     177         
     178Codeabschnitt 2-5 - The Steuerung, überarbeitet, in `index.php` 
    179179 
    180180    [php] 
    206206Das Datenmodell kann in eine Datenzugriffsschicht und eine Datenbankabstraktionsschicht untergliedert werden. Auf diese Weise verwenden Funktionen des Datenzugriffs keine datenbankspezifische Syntax, sondern rufen andere Funktionen auf, die die Abfragen durchführen. Wenn das Datenbanksystem später geändert wird, muss nur die Datenbankabstraktionsschicht angepasst werden. 
    207207 
    208 Ein Beispiel einer MySQL-spezifischen Datenbankabstraktionsschicht ist im Listing 2-6 dargestellt, gefolgt von einem Beispiel einer Datenzugriffsschicht im Listing 2-7. 
    209  
    210 Listing 2-6 - Die Datenbankabstraktionsschicht des Datenmodell 
     208Ein Beispiel einer MySQL-spezifischen Datenbankabstraktionsschicht ist im Codeabschnitt 2-6 dargestellt, gefolgt von einem Beispiel einer Datenzugriffsschicht im Codeabschnitt 2-7. 
     209 
     210Codeabschnitt 2-6 - Die Datenbankabstraktionsschicht des Datenmodell 
    211211 
    212212    [php] 
    235235    } 
    236236 
    237 Listing 2-7 - Die Datenzugriffsschicht des Datenmodells 
     237Codeabschnitt 2-7 - Die Datenzugriffsschicht des Datenmodells 
    238238 
    239239    [php] 
    264264         
    265265>**NOTE** 
    266 >Die Beispiele im Listing 2-6 und 2-7 sind immernoch nicht sehr zufriedenstellend, und es gibt noch einiges zu tun, um eine vollständige Abstraktion der Datenbank zu erreichen (Abstraktion der SQL-Abfragen durch einen datenbankunabhängigen Abfragegenerator, die Zusammenfassung aller Funktionen in einer Klasse, usw). Der Zweck dieses Buches ist es jedoch nicht Ihnen zu zeigen, wie Sie sämtlichen Quelltext selber schreiben, und Sie werden im Kapitel 8 feststellen, dass Symfony von Haus aus die ganze Abstraktion sehr gut beherrscht. 
     266>Die Beispiele im Codeabschnitt 2-6 und 2-7 sind immernoch nicht sehr zufriedenstellend, und es gibt noch einiges zu tun, um eine vollständige Abstraktion der Datenbank zu erreichen (Abstraktion der SQL-Abfragen durch einen datenbankunabhängigen Abfragegenerator, die Zusammenfassung aller Funktionen in einer Klasse, usw). Der Zweck dieses Buches ist es jedoch nicht Ihnen zu zeigen, wie Sie sämtlichen Quelltext selber schreiben, und Sie werden im Kapitel 8 feststellen, dass Symfony von Haus aus die ganze Abstraktion sehr gut beherrscht. 
    267267 
    268268#### Elemente der Darstellung 
    269269 
    270 Die Darstellungsschicht kann auch von einer weiteren Unterteilung des Quelltextes profitieren. Eine Webseite enthält oft einheitliche Elemente in der gesamten Anwendung: Den Seitenkopf, das grafische Layout, die Fußzeile, und die globale Navigation. Nur der innere Bereich der Seite ändert sich. Deshalb wird die Darstellung in ein Layout und eine Vorlage unterteilt. Das Layout wird normalerweise für die gesamte Anwendung oder eine Gruppe von Seiten verwendet. Die Vorlage schließt nur die von der Steuerung zur Verfügung gestellten Variablen ein. Es ist einiges an Logik notwendig, um das Zusammenspiel dieser Komponenten zu ermöglichen, und diese Darstellungsschicht wird die Bezeichnung Darstellung behalten. Gemäß dieser Prinzipien kann die Darstellung aus Listing 2-3 in drei Teile unterteilt werden, wie in den Listings 2-8, 2-9 und 2-10 zu sehen ist. 
    271  
    272 Listing 2-8 - Das Template, in `mytemplate.php` 
     270Die Darstellungsschicht kann auch von einer weiteren Unterteilung des Quelltextes profitieren. Eine Webseite enthält oft einheitliche Elemente in der gesamten Anwendung: Den Seitenkopf, das grafische Layout, die Fußzeile, und die globale Navigation. Nur der innere Bereich der Seite ändert sich. Deshalb wird die Darstellung in ein Layout und eine Vorlage unterteilt. Das Layout wird normalerweise für die gesamte Anwendung oder eine Gruppe von Seiten verwendet. Die Vorlage schließt nur die von der Steuerung zur Verfügung gestellten Variablen ein. Es ist einiges an Logik notwendig, um das Zusammenspiel dieser Komponenten zu ermöglichen, und diese Darstellungsschicht wird die Bezeichnung Darstellung behalten. Gemäß dieser Prinzipien kann die Darstellung aus Codeabschnitt 2-3 in drei Teile unterteilt werden, wie in den Codeabschnitts 2-8, 2-9 und 2-10 zu sehen ist. 
     271 
     272Codeabschnitt 2-8 - Das Template, in `mytemplate.php` 
    273273 
    274274    [php] 
    284284    </table> 
    285285 
    286 Listing 2-9 - Die Darstellung 
     286Codeabschnitt 2-9 - Die Darstellung 
    287287 
    288288    [php] 
    294294    ?> 
    295295 
    296 Listing 2-10 - Das Layout 
     296Codeabschnitt 2-10 - Das Layout 
    297297 
    298298    [php] 
    351351![Symfony Workflow](http://www.symfony-project.com/images/book/trunk/F0202.png "Symfony Workflow") 
    352352 
    353 Das bedeutet, dass die Liste der Beiträge, die wir in unserem Beispiel behandelt haben, mit Symfony nur drei Dateien benötigt, um zu funktionieren, dargestellt in den Listings 2-11, 2-12 und 2-13. 
    354 That means that the list of posts described in our example would require only three files to work in symfony, as shown in Listings 2-11, 2-12, and 2-13. 
    355  
    356 Listing 2-11 - `list` Aktion, in `myproject/apps/myapp/modules/weblog/actions/actions.class.php` 
     353Das bedeutet, dass die Liste der Beiträge, die wir in unserem Beispiel behandelt haben, mit Symfony nur drei Dateien benötigt, um zu funktionieren, dargestellt in den Codeabschnitts 2-11, 2-12 und 2-13. 
     354That means that the list of posts described in our example would require only three files to work in symfony, as shown in Codeabschnitts 2-11, 2-12, and 2-13. 
     355 
     356Codeabschnitt 2-11 - `list` Aktion, in `myproject/apps/myapp/modules/weblog/actions/actions.class.php` 
    357357 
    358358    [php] 
    368368    ?> 
    369369 
    370 Listing 2-12 - `list` Vorlage, in `myproject/apps/myapp/modules/weblog/templates/listSuccess.php` 
     370Codeabschnitt 2-12 - `list` Vorlage, in `myproject/apps/myapp/modules/weblog/templates/listSuccess.php` 
    371371 
    372372    [php] 
    382382    </table> 
    383383 
    384 Listing 2-13 - `list` Darstellung, in `myproject/apps/myapp/modules/weblog/config/view.yml` 
     384Codeabschnitt 2-13 - `list` Darstellung, in `myproject/apps/myapp/modules/weblog/config/view.yml` 
    385385 
    386386    listSuccess: 
    387387      metas: { title: Liste der Beiträge } 
    388388 
    389 Darüber hinaus müssen Sie immer noch ein Layout festlegen, wie im Listing 2-14, diese jann jedoch mehrfach wiederverwendet werden.       
    390  
    391 Listing 2-14 - Layout, in `myproject/apps/myapp/templates/layout.php` 
     389Darüber hinaus müssen Sie immer noch ein Layout festlegen, wie im Codeabschnitt 2-14, diese jann jedoch mehrfach wiederverwendet werden.         
     390 
     391Codeabschnitt 2-14 - Layout, in `myproject/apps/myapp/templates/layout.php` 
    392392 
    393393    [php] 
    401401    </html> 
    402402 
    403 Das ist wirklich alles, was Sie benötigen. Das ist genau der Quelltext, den Sie benötigen, um genau die gleiche Seite wie mit dem "flachen" Skript aus Listing 2-1 darzustellen. Den Rest (das Zusammenspiel aller Komponenten) erledigt Symfony. Wenn Sie die Anzahl der Quelltextzeilen zur Darstellung einer List von Beiträgen zählen, werden Sie feststellen, dass die Darstellung mittels Symfony und des MVC-Architekturmodells nicht viel mehr Zeit und Quelltext erfordert als mittels eines "flachen" Skripts. Gleichwohl birgt das Vorgehen enorme Vorteile, vor allem klare Quelltextorganisation, Wiederverwendbarkeit, Flexibilität, und viel mehr Spaß. Und als Dreingabe erhalten Sie XHTML-Konformität, Debug-Möglichkeiten, einfache Konfiguration, Datenbankabstraktion, elegante URLs, mehrere Anwendungsumgebungen, und noch viel mehr Entwicklungswerkzeuge. 
     403Das ist wirklich alles, was Sie benötigen. Das ist genau der Quelltext, den Sie benötigen, um genau die gleiche Seite wie mit dem "flachen" Skript aus Codeabschnitt 2-1 darzustellen. Den Rest (das Zusammenspiel aller Komponenten) erledigt Symfony. Wenn Sie die Anzahl der Quelltextzeilen zur Darstellung einer List von Beiträgen zählen, werden Sie feststellen, dass die Darstellung mittels Symfony und des MVC-Architekturmodells nicht viel mehr Zeit und Quelltext erfordert als mittels eines "flachen" Skripts. Gleichwohl birgt das Vorgehen enorme Vorteile, vor allem klare Quelltextorganisation, Wiederverwendbarkeit, Flexibilität, und viel mehr Spaß. Und als Dreingabe erhalten Sie XHTML-Konformität, Debug-Möglichkeiten, einfache Konfiguration, Datenbankabstraktion, elegante URLs, mehrere Anwendungsumgebungen, und noch viel mehr Entwicklungswerkzeuge. 
    404404         
    405405### Symfonys Hauptklassen 
    599599### Parameter-Klassen (Parameter Holder) 
    600600 
    601 Viele der Klassen in Symfony besitzen ein Objekt, dass Parameter bereithält. Es handelt sich hierbei um einen sauberen Weg, um Attribute mit sauberen `get` und `set` Methoden zu kapseln. Die Klasse sfResponse zum Beispiel besitzt einen Parameter Holder, auf den mit der Methode `getParameterHolder()` zugegriffen werden kann. Jeder Parameter Holder hält Daten auf die gleiche Art und Weise bereit, wie das Listing 2-15 zeigt. 
    602  
    603 Listing 2-15 - Verwendung des Parameter Holder `sfResponse` 
     601Viele der Klassen in Symfony besitzen ein Objekt, dass Parameter bereithält. Es handelt sich hierbei um einen sauberen Weg, um Attribute mit sauberen `get` und `set` Methoden zu kapseln. Die Klasse sfResponse zum Beispiel besitzt einen Parameter Holder, auf den mit der Methode `getParameterHolder()` zugegriffen werden kann. Jeder Parameter Holder hält Daten auf die gleiche Art und Weise bereit, wie das Codeabschnitt 2-15 zeigt. 
     602 
     603Codeabschnitt 2-15 - Verwendung des Parameter Holder `sfResponse` 
    604604 
    605605    [php] 
    608608     => 'bar' 
    609609 
    610 Die meisten Klassen, die einen Parameter Holder verwenden, besitzen Proxy-Methoden um den Zugriff auf die get/set Methoden abzukürzen. Das ist auch für das Objekt `sfResponse` der Fall, der Quelltext aus Listing 2-16 macht das gleiche wie im Listing 2-15. 
    611  
    612 Listing 2-16 - Verwendung der Parameter von `sfResponse` über Proxy-Methoden 
     610Die meisten Klassen, die einen Parameter Holder verwenden, besitzen Proxy-Methoden um den Zugriff auf die get/set Methoden abzukürzen. Das ist auch für das Objekt `sfResponse` der Fall, der Quelltext aus Codeabschnitt 2-16 macht das gleiche wie im Codeabschnitt 2-15. 
     611 
     612Codeabschnitt 2-16 - Verwendung der Parameter von `sfResponse` über Proxy-Methoden 
    613613 
    614614    [php] 
    617617     => 'bar' 
    618618 
    619 Die get-Methode des Parameter Holders akzeptiert als zweites Argument einen Standardwert. Diese Verhalten bietet einen nützlichen Rückfallmechanismus, der viel übersichtlicher ist als die Umsetzung mit Bedingungen. Im Listing 2-17 folgt ein Beispiel. 
    620  
    621 Listing 2-17 - Verwendung eines Standardwerts in der get-Methode des Parameter Holders 
     619Die get-Methode des Parameter Holders akzeptiert als zweites Argument einen Standardwert. Diese Verhalten bietet einen nützlichen Rückfallmechanismus, der viel übersichtlicher ist als die Umsetzung mit Bedingungen. Im Codeabschnitt 2-17 folgt ein Beispiel. 
     620 
     621Codeabschnitt 2-17 - Verwendung eines Standardwerts in der get-Methode des Parameter Holders 
    622622 
    623623    [php] 
    641641     => default 
    642642 
    643 Der Parameter Holder unterstützt sogar Namensräume. Wenn Sie ein drittes Argument für die set- und get-Methoden angeben, wird dieses als Namensraum verwendet, und der Parameter wird nur innerhalb dieses Namensraumes definiert. Listing 2-18 zeigt ein Beispiel.     
    644  
    645 Listing 2-18 - Verwendung von Namensräumen mit dem Parameter Holder von `sfResponse` 
     643Der Parameter Holder unterstützt sogar Namensräume. Wenn Sie ein drittes Argument für die set- und get-Methoden angeben, wird dieses als Namensraum verwendet, und der Parameter wird nur innerhalb dieses Namensraumes definiert. Codeabschnitt 2-18 zeigt ein Beispiel.       
     644 
     645Codeabschnitt 2-18 - Verwendung von Namensräumen mit dem Parameter Holder von `sfResponse` 
    646646 
    647647    [php] 
    653653     => 'bar2' 
    654654 
    655 Natürlich können Sie zu Ihren eigenen Klassen einen Parameter Holder hinzufügen, um sich die Syntaxvereinfachungen zu Nutze zu machen. Listing 2-19 zeigt, wie eine Klasse mit einem Parameter Holder definiert wird.   
    656  
    657 Listing 2-19 - Hinzufügen eines Parameter Holders zu einer Klasse 
     655Natürlich können Sie zu Ihren eigenen Klassen einen Parameter Holder hinzufügen, um sich die Syntaxvereinfachungen zu Nutze zu machen. Codeabschnitt 2-19 zeigt, wie eine Klasse mit einem Parameter Holder definiert wird.     
     656 
     657Codeabschnitt 2-19 - Hinzufügen eines Parameter Holders zu einer Klasse 
    658658 
    659659    [php] 
    676676### Konstanten 
    677677 
    678 Überraschenderweise werden Sie wenige Konstanten in Symfony finden. Der Hauptgrund ist, dass Konstanten in PHP einen großen Nachteil haben: Sie können ihren Wert nicht ändern, nachdem Sie definiert wurden. Symfony verwendet daher sein eigenes Konfigurationsobjekt namens sfConfig, welches Konstanten ersetzt. Das Objekt bietet statische Methoden, um von überall auf Parameter zugreifen zu können. Listing 2-20 demonstriert die Verwendung der Klasse sfConfig und ihrer Methoden. 
    679  
    680 Listing 2-20 - Verwendung der Klasse `sfConfig` und ihrer Methoden statt Konstanten 
     678Überraschenderweise werden Sie wenige Konstanten in Symfony finden. Der Hauptgrund ist, dass Konstanten in PHP einen großen Nachteil haben: Sie können ihren Wert nicht ändern, nachdem Sie definiert wurden. Symfony verwendet daher sein eigenes Konfigurationsobjekt namens sfConfig, welches Konstanten ersetzt. Das Objekt bietet statische Methoden, um von überall auf Parameter zugreifen zu können. Codeabschnitt 2-20 demonstriert die Verwendung der Klasse sfConfig und ihrer Methoden. 
     679 
     680Codeabschnitt 2-20 - Verwendung der Klasse `sfConfig` und ihrer Methoden statt Konstanten 
    681681 
    682682    [php]