Reminder: hoe een nieuwe site op te zetten met ZF2

Ben goed thuis in Zend Framework 1 – heb daarin behoorlijk wat sites ontwikkeld. De nieuwe versie van ZF2, nu twee maanden oud, is ingrijpend gewijzigd. Omdat ik elke keer moet opzoeken wat ook alweer de beste manier is om een nieuw project te starten, notuleer ik maar even de stappen:

  1. Maak een nieuwe map aan voor je project
  2. Download en installeer composer, het gemakkelijkst gewoon in je terminal:
    curl -s https://getcomposer.org/installer | php
  3. Gebruik Composer om de ZF standaardapplicatie en het framework zelf te installeren:
    php composer.phar create-project --repository-url="http://packages.zendframework.com" zendframework/skeleton-application
  4. Composer doet suggesties voor aanvullende bibliotheken en modules; de enige suggestie die ik standaard overneem, is doctrine/common, omdat deze de annotatiefunctionaliteit van Zend Form mogelijk maakt. Voeg aan de 'require'-sectie in het composer.json bestand toe:
    "doctrine/common": "dev-master",
    "bjyoungblood/bjy-profiler": "dev-master",
    "zendframework/zend-developer-tools": "dev-master"
  5. Voer achtereenvolgens de commando's in:
    php composer.phar self-update
    php composer.phar update

    Doctrine, alsmede de twee extra modules worden gedownload en geïnstalleerd. Deze moeten overigens nog wel geactiveerd worden in je applicatie.

  6. Kopieer alle bestanden uit de skeleton-applicatie naar je projectmap; de skeleton-map kun je weggooien
  7. Kopieer het configuratiebestand van Zend Developer Tools naar ./config/autoload; verwijder de extensie dist, zodat het bestand gevonden kan worden door ZF
  8. Pas ten slotte je module lijst aan. Mijn PHP-configuratiebestand ziet er nu zo uit:
    return array(
        'modules' => array(
            'Application',
            'ZendDeveloperTools',
            'BjyProfiler'
        ),
        'module_listener_options' => array(
            'config_glob_paths'    => array(
                'config/autoload/{,*.}{global,local}.php',
            ),
            'module_paths' => array(
                './module',
                './vendor',
                './vendor/bjyoungblood',
            ),
        ),
    );
    

Stukken over Zend Framework apart gezet

Ik heb een nieuw subdomein aangemaakt voor de technische verhalen die ik publiceer. Ze vormen in dit blog een vreemde eend in de bijt, en trekken een totaal ander publiek dan mijn spinsels over journalistiek, politiek en nieuwe media. Je kunt ze vanaf nu vinden op http://tech.raker.nl.

Je vindt daar ook het vervolg op mijn handleiding over Zend Framework. Die gaat over imagick en Zend_Mail. Ter lering en, voor sommigen, vermaak.

Formulieren en gegevensverwerking

Dit is het zevende deel van een serie over de bouw van een nieuwe website op basis van Zend Framework. Kijk in de zijbalk voor de linkjes naar de eerste delen.

Een van de meer gecompliceerde componenten van het Zend Framework is Zend_Form. Het duurt even voordat je doorhebt hoe de verschillende onderdelen van Zend_Form met elkaar samenwerken om het de developer uiteindelijk gemakkelijk te maken. Maar als je eenmaal die steile leercurve hebt doorlopen, zul  je merken dat je inspanningen niet voor niets zijn geweest.

Wat Zend_Form gecompliceerd maakt, is de veelheid van verschillende taken die eraan worden toegekend:

  • Het moet op eenduidige wijze formulieren weergeven in de pagina’s
  • Het moet gebruikersinput filteren en valideren
  • Het moet kunnen omgaan met de verschillende formulierelementen die in de verschillende HTML-specificaties zijn opgenomen.

Voor de weergave van formulieren worden decorators gebruikt; voor filtering en validatie filters en validators; en voor de verschillende elementen een deelcomponent die Zend_Form_Element wordt genoemd.

Zend_Form nader bekeken

Het belangrijkste dat je moet weten van Zend_Form is dat je deze component nooit rechtstreeks benadert. Je ontwerpt je eigen formulierklassen die een child vormen van Zend_Form. Binnen je formulierklasse hoef je geen aparte constructor te maken; sterker, het is aan te bevelen om dat niet te doen, omdat je dan een aantal standaardinstellingen van Zend_Form kunt overschrijven.

Zend_Form levert een hook, een lege methode die vanuit de constructor wordt aangeroepen, die je kunt gebruiken om je formulier te initialiseren. Die methode wordt, heel toepasselijk, ‘init’ genoemd. Je standaard formulier zal dus meestal zo’n opbouw kennen: Continue reading →

De database in Zend Framework

Dit is het zesde deel van een serie over de bouw van een nieuwe website op basis van Zend Framework. Kijk in de zijbalk voor de linkjes naar de eerste delen.

De kern van de meeste applicaties wordt gevormd door de aanwezige data. Die kunnen op veel verschillende manieren worden opgeslagen, maar bij meer complexe toepassingen zal er vrijwel altijd sprake zijn van een database. ZF zou natuurlijk onvolledig zijn als er niet een uitgebreide serie componenten beschikbaar was om toegang te bieden tot de database, zijn tabellen en gegevens.

Twee klassen zijn met name van belang: Zend_Db_Table_Abstract, en Zend_Db_Table_Row_Abstract. De eerste biedt een aantal methoden om toegang te krijgen tot de rijen gegevens in een tabel; de tweede tot de eigenschappen (de kolommen) van een afzonderlijke rij.

Opbouw van de database

Voordat we ons gaan richten op de interactie tussen de elesio en de database, moeten we eerst de juiste tabellen inrichten. Dat doen we op basis van de beschrijving in hoofdstuk 2, ‘Uitwerking van het concept’. In Mysql Workbench, het freeware GUI programma van Mysql, heb ik dit schema gemaakt:

Database schema van Elesio

Klik op de afbeelding om haar in groter formaat te zien.

Centraal in het schema staan twee tabellen, products en articles.

  1. Products is de moeder van twee afgeleide tabellen, books en gadgets. Boeken en apparaten worden beschouwd als de twee concrete producttypes die besproken kunnen worden op onze website. Die delen een aantal eigenschappen die in de moedertabel worden opgeslagen: het ean (een uniek productnummer, vergelijkbaar met het vroegere ISBN; maar dan algemener), de prijs, de invoerdatum, een herzieningsdatum, en een gemiddelde waardering van de gebruiker. Books en gadgets voeren daar nog hun specifieke eigenschappen aan toe, zoals titel, auteur, producent enzovoorts. Via de index products_id wordt de relatie gelegd met products tabel. De relatie tussen books en gadgets enerzijds en products anderzijds is één op één.
  2. In articles wordt alle content opgeslagen. Over elk product kunnen meerdere artikelen worden geschreven. Die relatie wordt belichaamd door de vreemde sleutel products_id in articles. Bovendien kan een artikel alleen worden geschreven door een geregistreerde gebruiker. Deze bevindt zich in de users tabel, en komt terug in de article tabel door de vreemde sleutel users_id.
  3. Er zijn voor de users vier verschillende rollen gedefinieerd: unconfirmed, registered, writer, admin. Wie zich registreert, is in eerste instantie een nieuwe, unconfirmed gebruiker. Zodra hij op de link in een bevestigingsmail klikt, wordt hij registered. Daarna is het aan de admin om een registered user te promoveren tot writer of zelfs tot admin. We hebben nog niet de exacte verschillen tussen deze rollen gedefinieerd, maar we willen onze applicatie toekomstbestendig maken; daarom is het handig om onze database daarop nu al in te richten. Wachtwoorden in onze applicatie worden versleuteld opgeslagen (sha1). Continue reading →

Controllers, Models en Views

Dit is het vijfde deel van een serie over de bouw van een nieuwe website op basis van Zend Framework. Kijk in de zijbalk voor de linkjes naar de eerste delen.

Zoals we al eerder hebben gezegd, vormen controllers de tussenlaag tussen het model (waar de logica van de applicatie wordt uitgevoerd) en de views (waar zich de presentatie naar de buitenwereld afspeelt). Er heerst de laatste jaren een consensus in kringen van software architecten dat het het best is om te streven naar skinny controllers and fat models: houd de controllers klein en overzichtelijk, en verplaats zoveel mogelijk code naar de models.

Een nieuwe pagina maken

We wijken even af van onze elesio-applicatie om met een simpel voorbeeld aan te tonen hoe we een nieuwe pagina maken in onze website. Open application/views/scripts/index/index.phtml en plaats onder je bestaande code een linkje:

[codesyntax lang=”html4strict” title=”application/views/scripts/index/index.phtml”]

<p><a href='/index/calculate'>Voer een berekening uit</a></p>

[/codesyntax]

Klik je daar nu op, dan zul je een foutmelding te zien krijgen. Dat gaan we snel verhelpen. Open een command-prompt, navigeer naar je projectmap, en geef dit commando op:

[codesyntax lang=”bash” title=”Command Line”]

php bin/zf.php create action calculate

[/codesyntax]

Als het goed is, zul je de boodschap terugkrijgen dat er code is toegevoegd aan je indexcontroller, en dat er een view script is aangemaakt. Open nu /application/controllers/IndexController.php: daar zie je dat de methode CalculateAction is toegevoegd aan de klasse. En in de map /application/views/scripts/index is een nieuw bestand aangemaakt: calculate.phtml.

Continue reading →

Zend Framework nader bekeken

Dit is het vierde deel van een serie over de bouw van een nieuwe website op basis van Zend Framework. Kijk in de zijbalk voor de linkjes naar de eerste delen.

Nu we de applicatie hebben opgezet, is het handig om eens van dichtbij al die mappen en bestanden te bekijken die Zend_Tool voor ons heeft klaargemaakt.

Application

Dit is de centrale map waarin je veruit het grootste deel van je ontwikkelwerk zult doen. Application zelf is weer onderverdeeld in

1. Configs – hierin worden de configuratiebestanden van je applicatie opgezet.

2. Controllers – de verzamelplaats waar de requests worden opgevangen die door de browser van de bezoeker naar je applicatie worden verstuurd, en waar de views worden aangestuurd die de bezoeker als gevolg van zijn request uiteindelijk te zien krijgt

3. Models – hierin wordt de logica van je applicatie ondergebracht

4. Views – de scripts waarin de html terecht komt die je uiteindelijk moet produceren om de pagina’s te tonen

Een van de belangrijkste besluiten die je neemt als je een applicatie bouwt met ZF, is de beslissing om een strikte scheiding aan te brengen tussen de logica die je applicatie nodig heeft om goed te functioneren, de pagina’s die getoond moeten worden wil de bezoeker kaas kunnen maken van deze logica, en de verbinding tussen logica en pagina’s.

Deze scheiding is nuttig: als je die altijd hanteert, betekent dat dat je je eigen code aan een strikte discipline onderwerpt. Je weet dat je nooit in je html hoeft te zaken naar databasefunctionaliteit of login-code, want die heeft keurig zijn eigen plek in de applicatiestructuur. Dit ontwerppatroon (design pattern) heeft MVC: Model-View-Controller. En laat die benaming nou net overeenkomen met de submappen onder application!

Continue reading →

Uitwerking van ons concept

Nu we de infrastructuur voor onze nieuwe applicatie op poten hebben, is het hoog tijd dat we beter nadenken over het soort site dat we eigenlijk willen. Normaal gesproken is dat natuurlijk de eerste stap bij het ontwikkelen van een nieuwe site; maar omdat we snel op weg willen met het Zend Framework, heb ik die uit didactische overwegingen wat naar achter geschoven. Totaal onverantwoord natuurlijk, maar in dit leerproces mogen we een steekje laten vallen. Luister eens, ik zou ook liever meteen in de code duiken, maar dat zou echt dom zijn.

Beschrijving in woorden

Een site over e-boeken en e-readers dus. Wat willen we? In ieder geval recensies lezen, van zowel boeken als readers. Die recensies gaan we niet allemaal zelf schrijven; geregistreerde gebruikers kunnen hun eigen recensies uploaden. Tegelijk willen we het voor uitgevers van e-boeken en producenten van e-readers gemakkelijk maken om hun nieuwe producten en boeken in te voeren – dan hoeven we dat allemaal niet zelf te doen.

Als er veel producten en recensies zijn, moet je die gemakkelijk kunnen terugvinden. Een zoekfunctie is daarom essentieel.

Het zou prettig zijn als die gebruikers zich werkelijk deel voelen van een gemeenschap. Kenmerken daarvan zijn onder andere dat het mogelijk moet zijn om contacten te leggen met je bestaande netwerken op Facebook, Twitter en Hyves; je moet je Outlook, Gmail en MSN-adressenlijst kunnen uitnodigen om een kijkje te komen nemen; en het moet gemakkelijk worden gemaakt om de onderlinge contacten op peil te houden door bijvoorbeeld een forum of zoiets dergelijks. Wie een recensie post, wil daar bovendien zijn relaties van op de hoogte te stellen; dus het zou fijn zijn als er meteen een berichtje op de Twitter-tijdlijn of de Facebook-wall van de gebruiker geplaatst kon worden. Ingelogde gebruikers kunnen reageren op nieuwsartikelen en recensies. Continue reading →

De goede ontwikkelomgeving voor je Zend Framework applicatie

OK, nu we duidelijk hebben waarom we Zend Framework willen inzetten voor de bouw van onze site voor e-boeken en e-readers, wordt het tijd om je computer zodanig in te richten dat je  deze applicatie ook gemakkelijk kunt gaan bouwen. Ik ga ervan uit dat je al een werkende WAMP/MAMP/LAMP installatie hebt, omdat dit immers niet de eerste keer is dat je een php-website bouwt. Mocht dat niet zo zijn, dan raad ik je aan je te registreren bij Zend, en vervolgens Zend Server Community Edition te downloaden en installeren. Hierin zit alles wat je nodig hebt, inclusief een volledige versie van het Zend Framework. Moet je Zend Framework apart downloaden, dan is registratie niet per se nodig. Dat kan in tar.gz– of in zip-formaat.

Heb je wel de beschikking over de goede installatie, dan is het nu eerst tijd om de infrastructuur op te zetten om een nieuwe website aan te maken. Dit betekent:

  1. Check van je Apache configuratie
  2. Aanpassing van je hosts file
  3. Aanmaken van een nieuwe map, Zend Framework beschikbaar maken
  4. Start een nieuw Zend Framework project
  5. Een virtual host inrichten Continue reading →

Werken met Zend Framework

Sinds een paar jaar ben ik gewoon om mijn nieuwe sites te bouwen in het Zend Framework. Ik begon daar al mee bij de Volkskrant; de belangrijkste reden is dat je in een team van developers gedwongen bent om codeerstandaarden in te voeren. Je collega’s moeten gemakkelijk en snel in jouw code kunnen kijken, zonder dat ze moeten zoeken naar de exacte locatie van een bug of feature. Overigens is het gebruik van een framework dat standaarden afdwingt niet alleen handig als je in een team werkt; ook voor solisten is het praktisch. Het is mij ten minste al vaak genoeg voorgekomen dat ik mijn eigen oude code moest nakijken en een uurtje of wat nodig had om mij de eigenaardigheden weer helemaal eigen te maken.

Waarom Zend Framework, en niet Symfony, Code Igniter of een andere? Dat is deels toeval (op zoek naar het beste framework kwam ik deze als eerste tegen), maar voor een groter deel heeft het te maken met de namen achter het framework en Zend. Per slot van rekening is dit Israëlische bedrijf de drijvende kracht achter de Zend Engine, het motortje waarop PHP nu al een flink aantal jaren draait. Je mag verwachten dat een framework dat door Zend is gebouwd, op de beste manier gebruik maakt van de programmeertaal.

Zend Framework (ZFW) is een verzameling losse componenten die je naar believen kunt inzetten in je eigen projecten. Je kunt een volledige website op het ZFW bouwen, waarin je gebruik maakt van het Model-View-Controller ontwerppatroon; of je kunt ervoor kiezen om in een simpele pagina bijvoorbeeld alleen Zend_Validate in te zetten voor het valideren van gebruikersinput.

Zend zelf beweert dat het ZFW heeft uitgevoerd met ‘extreme simpelheid en productiviteit’ in het achterhoofd. Dat is reclame-bullshit. Althans, wat betreft de simpelheid. Vergis je niet, ZFW is niet eenvoudig. Het kost tijd om je erin te verdiepen, en alle hoeken en gaten te leren kennen. Maar die investering betaalt zich dubbel en dwars terug. Als je eenmaal die initiële horden hebt genomen, dan is het werken met het ZFW een genot, en word je wel degelijk productiever. Je hergebruikt de standaard objecten die Zend maakt, maar ook die je zelf hebt opgebouwd of die je hebt gedownload van het internet. Een login-systeem, een webservice, een zoeksysteem, navigatie, sjablonen – uiteindelijk wordt het bouwen van een website niet veel meer dan het opzoeken van de juiste objecten en die in een nieuwe samenstelling met elkaar laten samenwerken.

Er is bij mijn weten geen goede Nederlandstalige tutorialsite voor het ZFW. In dit blog hoop ik enigszins in deze leemte te kunnen voorzien. We gaan een nieuwe applicatie bouwen waarin we gebruik maken van alle snufjes die ZFW, maar ook webservices als Flickr, Google, Amazon en anderen ons te bieden hebben. Het wordt een applicatie gericht op product reviews van e-readers en elektronische boeken, gekoppeld aan een blogging systeem. Tijdens de bouw komen we in aanraking met alle belangrijke componenten van ZFW, en leren we hoe we die het beste met elkaar kunnen laten samenwerken.

Voorkennis: je hoeft niks te weten van Zend, maar wel is het handig als je enigszins thuis bent in het object-georiënteerd programmeren in PHP5. Ook moet je weten hoe je een lokale server aan de praat krijgt en houdt, zodat je een ontwikkelomgeving tot je beschikking hebt waarin je naar hartelust kunt experimenteren. In de komende eerste aflevering komen we te praten over hoe die server ingericht moet worden.

Ik hoop dat je regelmatig terugkomt op dit blog om met me mee te bouwen en de voortgang te volgen. Ben benieuwd naar jullie commentaren en suggesties – laat het alsjeblieft weten als je bijzondere vragen hebt.

Veel plezier!