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.

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 →

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!