Door
Ozzie PHP
op 30-12-2010 16:10
gewijzigd op 06-01-2011 13:17
50.684 views
Hmmm, laat ik de vraag toch maar eens stellen. Ik wil graag een eigen framework / beheersysteem maken. De bedoeling is dat ik als het systeem klaar is heel makkelijk een website kan maken waar meteen al een standaard cms gedeelte in zit.
Ik ben al begonnen met een framework en ik maak daarbij gebruik van Zend Framework, maar nu vraag ik me het volgende af. Ik heb behoorlijk wat PHP kennis en ervaring inmiddels, maar ik heb hier geen opleiding voor gehad. Ik wil het mezelf dan ook altijd zo makkelijk mogelijk maken als ik aan het programmeren ben. Voorbeeld, als ik een databasequery wil uitvoeren dan wil ik niet een hele query in te hoeven typen, maar wil ik simpele functies kunnen gebruiken, bijvoorbeeld: $database->setTable('tabel') en $row = $database->select('naam') etc.
Ook vind ik het handig dat ik in Zend Framework een route makkelijk kan koppelen aan een controller en een actie. Daarnaast gebruik ik de MVC structuur (modules), de Zend_Registry functie om iets op te slaan en gebruik ik de caching functie voor het cachen van gegevens.
Ik gebruik Zend Framework dus voornamelijk voor:
- maken van mooie routes
- routes koppelen aan controller en actie
- MVC structuur (modules)
- Zend_Registry om variabelen op te slaan
- Caching
Voor de rest gebruik in Zend Framework eigenlijk niet. Ik weet dat er heeeel veel mogelijkheden in Zend Framework zitten, maar ik ben niet iemand die dat allemaal wil uitvogelen, en ik wil toch altijd graag mijn eigen code schrijven zodat ik precies weet wat de code doet en hoe deze in elkaar zit (zodat het voor mijzelf logisch is en makkelijk te gebruiken).
Nu vraag ik me 2 dingen af:
1) is het voor mij eigenlijk wel zinvol om Zend Framework te gebruiken aagezien ik er niet heel veel mogelijkheden van benut.
2) zijn de 5 functies waar ik gebruik van maak (makkelijk) ook zelf te maken of is dat heel erg ingewikkeld?
Wat raden jullie aan? Zend Framework blijven gebruiken ook al gebruik ik er maar weinig van? Of toch zelf mijn eigen functies maken en Zend Framework niet meer gebruiken? Ik stel deze vraag ook omdat Zend Framework zo'n 23mb aan serverruimte in beslag neemt.
Wel zoiets als sneller en in jouw ogen overzichtelijker.
Simpele queries zijn natuurlijk prima met een API te maken, ingewikkelder niet.
Wat voor jou het beste is, hangt alleen van jouzelf af...
Persoonlijk vind ik niet-select queries sowieso handiger met een api.
De tweede optie is beter. Niet de eerste. ;)
Lees de reply van Mark PHP 01/01/2011 21:49:03 nog maar eens..
Hoezo dat dan? Door niet zelf de queries te schrijven maak je je code abstracter. Je beschrijft meer wat je wil in plaats van hoe je dat wilt. Eén van de voordelen die dat biedt is dat je code onafhankelijk wordt van de achterliggende database. Als je later overstapt op een nieuwe versie die syntaxwijzigingen heeft (of je switcht van DB) dan hoef je alleen je config aan te passen. Het is dus meer de OO gedachte. Daarnaast dwingt Active Record automatisch veilige queries af door alles te escapen, door een XSS filter te halen enzovoorts. Er zijn inderdaad situaties waarin Active Record geen oplossing biedt.
Active Record stelt je in staat een generieke modellaag te creeëren. Hierdoor kan je sneller code ontwikkelen. Als ik afgestudeerd ben zal ik daar eens een tutorial over schrijven. Je code wordt overzichtelijker vooral als je queries genereert afhankelijk van user input. In een situatie waar je 0 of meer WHERE statements kan hebben moet je als je zelf de query samenstelt counters gaan bijhouden of een hack als 'WHERE 0=1 ' toepassen zodat je daarna 'OR kolom=waarde' kan doen. Met Active Record kan je gewoon een array meegeven ('$this->db->where($where)'). Zit er niks in dan krijg je geen WHERE. Je hoeft dus geen loopjes en if statements te maken.
Ander voorbeeld: inserten. $this->db->insert('tablename', $values). Kan het nog simpeler? Ander voorbeeld: foutafhandeling. Heel goed geregeld (nog specifiek of je read of write queries uitvoert). Als je zelf queries schrijft dan weet het framework niet wat er geschreven is en kan het daaromheen liggende proces ook niet geoptimaliseerd worden. Helaas is deze gedachte nog niet echt in de PHP wereld ingebakken, in tegenstelling tot bijvoorbeeld Microsoft met producten als Linq. Eén databaseachtige manier om met alle databronnen zoals tekstbestanden, excelbestanden, databases, xml bestanden te communiceren.
Complexe queries zijn niet of nauwelijks in zo'n abstractielaag uit te drukken.
Veel bronnen op internet menen dat je de ene taal niet in de andere moet mappen.
Simpele inserts zijn natuurlijk veel handiger in zo'n DBAL, veel selects niet.
Hoezo dat dan? Door niet zelf de queries te schrijven maak je je code abstracter. Je beschrijft meer wat je wil in plaats van hoe je dat wilt.
Wat is het verschil in $query = $this->select('x')->from('y')->where('z'); en $query = "SELECT x FROM y WHERE z"? Het eerste is omslachtiger. Het is een drogreden om te denken dat het eerste simpeler is omdat de developer dan geen SQL hoeft te kennen.
Daarbij aansluitend je tweede argument, dat Active Record je query aanpast naar standaard SQL. Dit wil je vaak niet, omdat je profijt wilt hebben van de trukjes, voordelen en functies die een specifieke database je biedt. Uiteraard zul je, als je ooit wil switchen naar een andere database, je queries hier en daar aan moeten passen. Maar zolang je alle SQL in een bepaalde applicatielaag hebt, is dit een peuleschil.
The Force op 02/01/2011 21:17:23
In een situatie waar je 0 of meer WHERE statements kan hebben moet je als je zelf de query samenstelt counters gaan bijhouden of een hack als 'WHERE 0=1 ' toepassen zodat je daarna 'OR kolom=waarde' kan doen.
Ik kan me niet echt een situatie indenken waarbij je in PHP WHERE clausules aan elkaar gaat plakken.
The Force op 02/01/2011 21:17:23
Daarnaast dwingt Active Record automatisch veilige queries af door alles te escapen, door een XSS filter te halen enzovoorts.
Dit kan je ook afdwingen door een eigen Database klasse te schrijven, en alleen Prepared Statements toe te staan. Bovendien kan je adapters schrijven voor MySQL, PostgreSQL, Oracle enzovoort. XSS filteren doe je overigens niet als je data de database in moet, maar pas als je het aan de gebruiker presenteert.
[quote="The Force op 02/01/2011 21:17:23"]
Hoezo dat dan? Door niet zelf de queries te schrijven maak je je code abstracter. Je beschrijft meer wat je wil in plaats van hoe je dat wilt.
Wat is het verschil in $query = $this->select('x')->from('y')->where('z'); en $query = "SELECT x FROM y WHERE z"? Het eerste is omslachtiger. Het is een drogreden om te denken dat het eerste simpeler is omdat de developer dan geen SQL hoeft te kennen.[/quote]
Er is een andere reden waarom die 1e manier wel de voorkeur heeft, namelijk het automatisch aanvullen van functies waardoor je sneller een query kan schrijven, maar dit is persoonlijk natuurlijk.
Kun je die method chaining eigenlijk ook intelligent maken vraag ik me af?
Want in theorie zou je kunnen zeggen $database->select('naam')->from('gebruikers')->select('leeftijd').
Let op, in bovengenoemd voorbeeld maak ik bewust een fout door 2x select() aan te roepen. Zou je het nu ook zo kunnen maken dat zodra je seelct hebt aangeroepen je niet nogmaals select kunt aanroepen? Of kan dat niet?
uhm... ja.. maar ik bedoel het anders... Zend Studio vult bijvoorbeeld heel mooi de beschikbare functies in een class aan... maar zou het dan kunnen dat je zodra je select hebt gebruikt die functie niet meer tevoorschijn komt bij het aanvullen? Hmm... ik denk eigenlijk dat dat niet kan, tenzij je een andere class returnt.