Door
Ozzie PHP
op 30-12-2010 16:10
gewijzigd op 06-01-2011 13:17
50.686 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.
[quote="Ozzie PHP op 01/01/2011 17:38:18"]
Aaaah... dat ziet er nice uit! :)
Is dat lastig om zelf te bouwen? Of gewoon kwestie van een goede tutorial? Lijkt me in ieder geval wel een superhandige optie!
Gewoon CI gebruiken die hebben beiden opties aanwezig. ;)
Maar bovenstaande is natuurlijk allemaal mooi bedacht, maar hebben jullie er ook aan gedacht dat het soms helemaal niet handig is om met dit soort active records te werken?
Denk bijvoorbeeld aan complexe query's e.d...
[/quote]
Het zal inderdaad eens voorkomen dat je de query niet kan genereren met Active Record. Maar leg mij eens uit waarom je in de andere gevallen het dan niet zou moeten gebruiken?
@Ozzie: method-chaining is makkelijk te maken, je functie moet een instantie van hemzelf teruggeven zodat daarop weer een functie aangeroepen kan worden. Dat kan met $this vanaf PHP5. Even zonder controle, maar dit hieronder zou moeten werken:
<?php
class Testing {
public $voorbeeld = '';
//Test functie
function voegBlaatToe() {
//Doe wat...
$this->voorbeeld .= "Blaat";
//Return instantie.
return $this;
}
function getBlaats() {
return $this->voorbeeld;
}
}
$blaat = new Testing();
echo $blaat->voegBlaatToe()->voegBlaatToe()->voegBlaatToe()->getBlaats();
//Output "BlaatBlaatBlaat"...
?>
Maar als ik je goed begrijp moet je dus bij iedere functie "return $this;" toevoegen? Kan dat bijvoorbeeld niet overkoepelend? Dat het voor alle functies in een bepaalde class geldt?
Maar als ik je goed begrijp moet je dus bij iedere functie "return $this;" toevoegen? Kan dat bijvoorbeeld niet overkoepelend? Dat het voor alle functies in een bepaalde class geldt?
Nope, elke functie moet zelf aangeven wat het terug geeft...
Zonder heel diep op voorgaande posts in te willen gaan, heb ik toch een aantal opmerkingen.
Allereerst, pas op met het Active Record Pattern. Een aparte klasse (of zelfs meerdere) is/zijn NOOIT in staat om sneller of simpeler te zijn dan een query in een variabele. Sterker nog, wat is er nu makkelijker dan "SELECT x FROM y WHERE z = 1"? Elke (beginnende) developer snapt direct wat er gebeurd. Wel is het natuurlijk netjes om al je database verkeer in een aparte laag te regelen, zoals de M in MVC. Het Data Mapper Pattern is hiervan een voorbeeld, maar er zijn er nog een paar.
Ten tweede ben ik geen fan van CodeIgniter. Een framework dat in deze tijd nog compatibel met PHP4 probeert te zijn valt bij mij bij voorbaat al af. Vreemd genoeg heb ik in dit topic nog niets gelezen over Kohana. Dit framework werkt wel met PHP5, en is ook nog eens gebaseerd op CodeIgniter.
Daarnaast heb je natuurlijk nog Symfony, Yii, Zend Framework en ga zo maar door. Het aangekondigde Symfony Reloaded lijkt veelbelovend, vooral de ideeën achter de Kernel en Dependency Injection zijn indrukwekkend. Een nadeel is dat Symfony overal configuratie instellingen voor heeft. Qua modulariteit is dit super, maar van mij mag het wat minder. Yii werkt veel met statische klassen, dat is voor mij een grote min. Singleton is voor mij een anti pattern. Dan, het Zend Framework zit theoretisch prima in elkaar, maar praktisch werkt het niet altijd. Voor goede performance zul je ergens anders moeten zoeken.
Zelf heb ik al enkele ontwikkelcycli van mijn eigen framework doorlopen. Aangezien performance en modulariteit voor mij het belangrijkst zijn, richt ik me vooral hier op. Vooral het maken van een goede, werkende MVC structuur is een pittige, maar uitdagende, klus.
Aan de topicstarter zou ik verder willen adviseren dat het niet zo slim is om met geringe kennis meteen een framework te willen bouwen. Dat lijkt me wat ambitieus, zeker aangezien je geen achtergrondkennis in de webwereld (design patterns, OOP etc.) zegt te hebben. Kies er dan voor met een bestaand framework wat te bouwen, daar zal je op dit moment het meest van leren.
Thanks voor je bijdrage Mark. Zeker iets om over na te denken. Het MVC model ken ik aardig vanuit Zend en met OOP ben ik redelijk vertrouwd, maar dingen als kernel en dependency injection zegt me dan weer niks. Misschien is framework ook wel een te breed woord hoor voor wat ik wil. Ik wil gewoon een eigen systeem via MVC structuur wat voor mij makkelijk in gebruik is. Misschien is beheersysteem een beter woord?
Ik weet niet precies wat je nu bedoeld. Een beheersysteem in de zin van CMS? Of een projectopzet, waarbij je direct begint met applicatiespecifieke code en de basis al bestaat?
In dat tweede geval zou een basis MVC opzet prima werken. Er bestaat zelfs al een geinig framework welke in een tweet past (Twitto). Toch kan het MVC principe al vrij ingewikkeld worden. Ik stoei momenteel met de volgende dingen:
- Routing,
- Dependency Injection (meegeven van bijvoorbeeld database, log, cache klassen aan de verschillende controllers, op basis van een configuratiebestand),
- Layouts,
- Helpers (nemen een klein deel van de layout voor hun rekening, zodat deze cross-controller gebruikt kan worden),
- Plugins of widgets (niet perse nodig, maar wel leuk om te hebben).
Je kan het eigenlijk zo ingewikkeld maken als je het zelf wilt. Bovenstaande dingen zijn in mijn ogen echt onmisbaar. Maar alles (netjes!) met elkaar te verbinden is moeilijker dan het lijkt. Als je geen deadline hebt, zou ik hier zeker mee gaan stoeien. Een eigen framework (proberen te) maken leert je veel over OOP, Design Patterns en noem maar op.
Is dit eenmaal gelukt, dan kan je eens kijken naar HMVC, ingebouwde AJAX support en andere leuke dingetjes. Maar dat is voor later.
Ik weet niet precies wat je nu bedoeld. Een beheersysteem in de zin van CMS? Of een projectopzet, waarbij je direct begint met applicatiespecifieke code en de basis al bestaat?
Eigenlijk een combinatie van beide :)
Als ik een website moet maken dan wil ik mijn "framework" op de server zetten, en dan meteen al een goede basis hebben. Met basis bedoel ik een basis CMS systeem waarin je bijvoorbeeld routes kunt aanmaken en users kunt toevoegen. Daarnaast is de code dan volgens het MVC model opgezet en beschik ik al over bepaalde basis-functionaliteit (bijvoorbeeld database en caching). Dat is een beetje wat ik wil bereiken.Snap je wat ik bedoel?