Development

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

You must first sign up to be able to contribute.

Changes between Version 16 and Version 17 of Documentation/nl_NL/book/1.0/02-Exploring-Symfony-s-Code

Show
Ignore:
Author:
Stefan.Koopmanschap (IP: 86.94.154.72)
Timestamp:
09/12/07 00:23:58 (10 years ago)
Comment:

better title markup, navigation through chapters, small typo fix

Legend:

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

    v16 v17  
    2222Om je te helpen de voordelen van MVC te begrijpen, kijken we hoe een basis PHP applicatie naar een MVC-gebaseerde applicatie kan worden omgezet. Een lijst met berichten voor een weblop applicatie is een goed voorbeeld. 
    2323 
    24 '''Standaard programmeren''' 
     24==== Standaard programmeren ==== 
    2525 
    2626In een standaard PHP bestand kan het presenteren van een lijst met database records eruit zien als in listing 2-1. 
    7777    * De code draait alleen op een MuSQL database. 
    7878 
    79 '''Het isoleren van de presentatie''' 
     79==== Het isoleren van de presentatie ==== 
    8080 
    8181De echo en printf aanroepen in Listing 2-1 maakt de code moeilijk om te lezen. Het aanpassen van de HTML code om de presentatie te verbeteren is een gedoe met de huidige syntax. Dus kan de code opgesplitst worden in twee delen. Eerst, de pure PHP code met alle business logica in een controller script, zoals aangegeven in listing 2-2. 
    139139Alle logica wordt verplaatst naar het controller script, en bevat pure PHP met geen enkele HTML. Hetzelfde controller script zou in theorie ook gebruikt moeten kunnen worden voor een compleet andere presentatie, zoals een PDF bestand of een XML structuur. 
    140140 
    141 '''Het isoleren van de Data Manipulatie''' 
     141==== Het isoleren van de Data Manipulatie ==== 
    142142 
    143143Het grootste deel van het controller script wordt gebruikt voor data manipulatie. Maar wat als je een lijst van posts in een andere controller moet hebben, bijvoorbeeld een die een RSS feed genereert van de weblog posts? Wat als je alle database queries in een plek wil hebben, om te voorkomen dat er dubbele code ontstaat? Wat als je beslist het data model aan te passen en de post tabel te hernoemen naar weblog_post? Wat als je wil wisselen naar PostgreSQL in plaats van MySQL? Om dit allemaal mogelijk te maken moet je de data manipulatie code uit de controller verwijderen en dit in een ander script stoppen. Dit script is het model, en is weergegeven in Listing 2-4. 
    198198Het model script is volledig gewijd aan data toegang en kan als zodanig georganiseerd worden. Alle parameters die niet afhankelijk zijn van de data laag (zoals de request parameters) moeten door de controller worden doorgegeven, en niet direct door het model worden benaderd. De model functies kunnen dan makkelijk door een andere controller worden hergebruikt. 
    199199 
    200 == Scheiden van Lagen Voorbij MVC == 
     200=== Scheiden van Lagen Voorbij MVC === 
    201201 
    202202Het principe van de MVC architectuur is dus het scheiden van de code in drie lagen, afhankelijk van de natuur van de code. Data logica code in het model, presentatie code in de view en applicatie logica in de controller. 
    204204Andere design patterns maken je programmeer ervaring nog makkelijker. De model, view en controller lagen kunnen nog verder worden onderverdeeld. 
    205205 
    206 '''Database Abstractie''' 
     206==== Database Abstractie ==== 
    207207 
    208208De model laag kan worden opgesplitst in een data-toegangslaag en een database abstractie laag. Op die manier gebruikt de data-toegangslaag geen database-afhankelijke query statements, maar roept andere functies aan die de queries uitvoeren. Als je later van database systeem verandert, hoeft alleen de database abstractie laag te worden aangepast. 
    270270    De voorbeelden in Listing 2-6 en 2-7 zijn nog steeds niet heel erg bevredigend, en er moet nog wat werk gedaan worden op een volledige database abstractie te bewerkstelligen (bijvoorbeeld door de SQL code te laten genereren door een database-onafhankelijke query bouwer, het verplaatsen van alle functies naar een class, en dergelijke). Maar het doel van dit boek is niet om je te tonen hoe je alle code handmatig kan schrijven, en je zult in hoofdstuk 8 zien dat symfony van nature de abstractie zeer goed uitvoert. 
    271271 
    272 '''View Elementen''' 
     272==== View Elementen ==== 
    273273 
    274274De view laag kan ook voordeel halen uit scheiding van code. Een web pagina bevat vaak elementen die consistent zijn door de hele applicatie: de pagina headers, de grafische layout, de footer, en de globale navigatie. Alleen het binnenste deel van een pagina verandert. Dat is de reden dat de view wordt gescheiden in de layout en de template. De layout is normaal gesproken globaal voor de applicatie, of een groep van pagina's. De template geeft alleen vorm aan de variabelen die door de controller beschikbaar zijn gesteld. Enige logica is nodig om deze componenten samen te laten werken, en deze laag om te bekijken krijgt daarom de naam 'view'. Deze principes volgend kan de view in Listing 2-3 opgesplitst worden in drie delen, zoals getoond in Listings 2-8, 2-9 en 2-10. 
    313313}}} 
    314314 
    315 '''Action en Front Controller''' 
     315==== Action en Front Controller ==== 
    316316 
    317317De controller doet niet veel in het vorige voorbeeld, maar in echte web applicaties moet de controller veel werk doen. Een belangrijk deel van dit werk wordt door alle controllers van een applicatie uitgevoerd. Deze veelvoorkomende taken zijn het afhandelen van de request, beveiliging, laden van de configuratie, en dergelijke. Dit is de reden dat een controller vaak wordt opgedeeld in een front controller, die uniek is voor de applicatie, en actions, die alleen de controller code bevatten voor een specifieke pagina. 
    319319Een van de grootste voordelen van een front controller is dat het een unieke ingang bied voor de volledige applicatie. Als je ooit besluit om de toegang tot de applicatie af te sluiten hoef je alleen het front controller script te wijzigen. In een applicatie zonder controller moet je alle individuele controllers uitzetten. 
    320320 
    321 '''Object Orientatie''' 
     321==== Object Orientatie ==== 
    322322 
    323323Alle eerdere voorbeelden gebruiken procedureel programmeren. De OOP mogelijkheden van moderne talen maakt het programmeren nog makkelijker, omdat objecten logica kunnen bevatten, kunnen overerven van anderen, en schone benamingsconventies kunnen bieden.  
    329329  Als je meer wil leren over design patterns voor web applicaties in een object-georienteerde context, lees dan "Patterns of Enterprise Application Architecture" van Martin Fowler (Addison-Wesley, ISBN: 0-32112-742-0). Code voorbeelden in het boek van Fowler zijn in Java en C#, maar zijn nog steeds goed leesbaar voor PHP ontwikkelaars. 
    330330 
    331 '''Symfony's MVC Implementatie''' 
     331==== Symfony's MVC Implementatie ==== 
    332332 
    333333Maar wacht even. Voor een enkele pagina met een lijst met posts in een weblog, hoeveel componenten zijn daarvoor nodig? Zoals in figuur 2-2 geillustreerd, hebben we de volgende onderdelen: 
    393393}}} 
    394394 
    395 Daarnaats zal je nog steeds een layout moeten definieren, zoals wordt aangegeven in Listing 2-14, maar deze zal veel worden hergebruikt. 
     395Daarnaast zal je nog steeds een layout moeten definieren, zoals wordt aangegeven in Listing 2-14, maar deze zal veel worden hergebruikt. 
    396396 
    397397''Listing 2-14 - Layout, in myproject/apps/myapp/templates/layout.php'' 
    410410En dat is eigenlijk alles wat je nodig hebt. Dit is de exacte code die nodig is om dezelfde pagina te tonen als het simpele script eerder in Listing 2-1. De rest (alle componenten laten samenwerken) wordt afgehandeld door symfony. Als je de regels telt, zal je zien dat het maken van een lijst van posts in een MVC architectuur met symfony niet meer tijd of programmeerwerk zal vergen als het schrijven van een "plat" bestand. Desalniettemin geeft het je veel grote voordelen, zoals duidelijke code organisatie, herbruikbaarheid, flexibiliteit en veel meer leuks. En als een bonus heb je XHTML ondersteuning, debug mogelijkheden, makkelijke configuratie, database abstractie, slimme URL routing, meerdere omgevingen, en veel meer ontwikkel tools. 
    411411 
    412 '''Symfony Kern Classes''' 
     412==== Symfony Kern Classes ==== 
    413413 
    414414De MVC implementatie in symfony gebruikt een aantal classes die je vaak zal tegenkomen in dit boek: 
    425425  Tussen de programmeerstandaard gebruikt in symfony, UpperCamelCase is de standaard voor class en variabele benaming. Er bestaan twee uitzonderingen: kern symfony classes beginnen met sf, allemaal kleine letters, en variabelen gebruikt in templates gebruiken de underscore-gescheiden syntax. 
    426426 
    427 '''Code Organisatie''' 
     427=== Code Organisatie === 
    428428 
    429429Nu dat je de verschillende componenten van een symfony applicatie kent, vraag je je waarschijnlijk af hoe ze zijn georganiseerd. Symfony organiseert de code in een project structuur en plaatst de project bestanden binnen een standaard boomstructuur. 
    430 '''Project Structuur: Applicaties, Modules en Acties''' 
     430 
     431==== Project Structuur: Applicaties, Modules en Acties ==== 
    431432 
    432433In symfony is een project een set diensten en operaties die beschikbaar zijn onder een bepaalde domeinnaam, die allemaal hetzelfde object model delen. 
    446447[[Image(http://www.symfony-project.com/images/book/1_0/F0203.png)]] 
    447448 
    448 '''Bestands Boomstructuur''' 
     449==== Bestands Boomstructuur ==== 
    449450 
    450451Alle web projecten delen over het algemeen dezelfde types inhoud, zoals de volgende: 
    461462Symfony bied een standaard bestandsboomstructuur om alle deze inhoud op een logische manier te organiseren, consistent met de keuzes op het gebied van architectuur (MVC patroon en project/applicatie/module groepering). Dit is de boomstructuur die automatisch wordt aangemaakt wanneer een project, applicatie of module wordt geinitialiseerd. Natuurlijk kan je het volledig aanpassen aan je wensen, om bestanden naar je eigen voorkeur te plaatsen of om aan de eisen van je klant te voldoen. 
    462463 
    463 '''Root Boomstructuur''' 
     464==== Root Boomstructuur ==== 
    464465 
    465466Dit zijn de directories die je vind in de root van een symfony project: 
    505506|| web/ || De root voor de web server. Dit zijn de enige bestanden die via het Internet beschikbaar zijn. || 
    506507 
    507 '''Applicatie Boomstructuur''' 
     508==== Applicatie Boomstructuur ==== 
    508509 
    509510De boomstructuur van alle applicatie directories is hetzelfde:  
    536537De classes van een applicatie hebben geen toegang tot methodes of attributen in andere applicaties van hetzelfde project. Hou er ook rekening mee dat hyperlinks tussen twee applicaties van hetzelfde project een absolute form moeten bevatten. Deze laatste limitatie moet je in gedachte houden tijdens de initialisatie, wanneer je kiest hoe je je project in applicaties wil verdelen.  
    537538 
    538 '''Module Boomstructuur''' 
     539==== Module Boomstructuur ==== 
    539540 
    540541Elke applicatie bevat een of meerdere modules. Elke module heeft een eigen subdirectory binnen de modules directory, en de naam van de module wordt gekozen tijdens het opzetten hiervan.  
    568569  De config/, lib/ en validate/ directories zijn leeg voor een nieuwe module. 
    569570 
    570 '''Web Boomstructuur''' 
     571==== Web Boomstructuur ==== 
    571572 
    572573Er zijn maar heel weinig limitaties voor de web directory. In de web directory bevinden zich de publiek beschikbare bestanden. Het volgen van een aantal simpele benamingsconventies bied een standaard en een aantal handige shortcuts binnen de templates. Hier is een voorbeeld voor de structuur van een web directory: 
    591592  Hoewel het van harte wordt aangeraden de standaard boomstructuur te gebruiken, is het mogelijk om deze aan te passen voor specifieke wensen, zoals het toestaan een project in een server met een andere boomstructuur te plaatsen. Kijk naar Hoofdstuk 19 voor meer informatie over het aanpassen van de bestandsboomstructuur. 
    592593 
    593 '''Veelvoorkomende Instrumenten''' 
     594=== Veelvoorkomende Instrumenten === 
    594595 
    595596Een aantal technieken worden regelmatig gebruikt in symfony, en je zal deze vaak tegenkomen in dit boek en je eigen projecten. Onder andere parameter houders, constanten, en het automatisch laden van classes. 
    596597 
    597 '''Parameter Houders''' 
     598==== Parameter Houders ==== 
    598599 
    599600Veel van de symfony classes bevatten een parameter houder. Dit is een makkelijke manier om de attributen te omvatten met schone getter en setter methodes. Bijvoorbeeld, de sfResponse class bevat een parameter houder die je kan aanroepen met de getParameterHolder() methode. Elke parameter houder slaat gegevens op dezelfde manier op, zoals geillustreerd in Listing 2-15. 
    685686}}} 
    686687 
    687 '''Constanten''' 
     688==== Constanten ==== 
    688689 
    689690Verrassend genoeg zal je maar weinig constanten vinden in symfony. Dit is omdat in PHP constanten een groot nadeel hebben: Je kan hun waarde niet aanpassen nadat ze gedefinieerd zijn. Daarom gebruikt symfony een eigen configuratie object, genaamd sfConfig, die deze constanten vervangt. Het bied statische methodes om van overal toegang te krijgen tot parameters. Listing 2-20 demonstreert het gebruik van de sfConfig class methodes. 
    703704De sfConfig methodes ondersteunen standaard waardes en je kan de sfConfig::set() methode vaker aanroepen om de waarde van de parameter aan te passen. Hoofdstuk 5 gaat in meer detail in op de sfConfig methodes. 
    704705 
    705 '''Class Autoloading''' 
     706==== Class Autoloading ==== 
    706707 
    707708Vanouds is het altijd zo geweest dat je, wanneer je een class methode gebruikt of een object aanmaakt in PHP, je eerst de class definitie moet includen. 
    728729  Voor een betere performance scant symfony een lijst met directories (gedefinieerd in een intern configuratiebestand) tijdens de eerste request. Het registreert dan alle classes die in deze directories worden gevonden en slaat deze class/bestand lijsten op in een PHP bestand als een associatieve array. Op die manier hoeven de directory scans niet meer bij elke aanroep uitgevoerd te worden. Dit is ook waarom je de cache moet legen nadat je een class toevoegt of verplaatst binnen je project. De cache leeg je met het symfony clear-cache commando. Je zal meer leren over de cache in Hoofdstuk 12, en over de configuratie van het autoloaden in Hoofdstuk 19. 
    729730 
    730 '''Samenvatting''' 
     731== Samenvatting == 
    731732 
    732733Het gebruik van een MVC framework dwingt je om je code te verdelen en te organiseren volgens de conventies van het framework. Presentatiecode gaat naar de view, data manipulatie gaat naar het model, en de aanvraag manipulatie logica gaat in de controller. Het maakt het gebruik van het MVC patroon zowel behulpzaam als erg limiterend. 
    735736 
    736737Nu dat je de onderliggende theorie achter symfony kent, ben je bijna klaar om je eerste applicatie te ontwikkelen. Maar voordat je dat doet, moet je een symfony installatie op je ontwikkelomgeving werkend krijgen. 
     738 
     739[http://trac.symfony-project.com/trac/wiki/Documentation/nl_NL/book/1.0/01-Introducing-Symfony < Hoofdstuk 1 - Introductie] [http://trac.symfony-project.com/trac/wiki/Documentation/nl_NL/book/1.0/03-Running-Symfony Hoofdstuk 3 - Symfony Draaien >]