1.3. We stellen ons PHP-framework samen
Er zijn veel verschillende manieren om een framework te bouwen. Sommigen geven de voorkeur aan zeer complexe frameworks, anderen aan zeer eenvoudige. In onze artikelen gaan we snel een framework samenstellen dat eenvoudig te gebruiken en gemakkelijk te begrijpen is.
Onze artikelen helpen je om je eigen framework te ontwikkelen, dat verschilt van wat wij nodig hebben voor het maken van een online winkel. Je zult eenvoudig andere onderdelen kunnen toevoegen aan het framework om iets groters te creëren. Het hoofddoel van deze reeks artikelen is om te leren hoe je je eigen framework kunt bouwen voor elk CMS.
Patronen (Patterns)
Voor de ontwikkeling van een framework worden verschillende ontwerppatronen toegepast. Een patroon is een beproefde oplossing of praktijk die helpt bij het oplossen van algemene programmeerproblemen. Onder de patronen zullen we de volgende gebruiken:
- Model-View-Controller (MVC)
- Register (Registry)
- Singleton (Enkelvoudige klasse)
Model-View-Controller (MVC)
MVC is de basis van ons framework en biedt een oplossing voor het scheiden van de gebruikersinterface en de logica van onze applicatie. De gebruikersinterface (View) werkt samen met de datamodellen (Model) via controllers (Controller), die op hun beurt de bedrijfslogica bevatten die nodig is om gegevens in de modellen te beheren.
Bijvoorbeeld, wanneer een gebruiker op “Toevoegen aan winkelwagen” klikt in de View, verwerkt de controller dit verzoek, communiceert met het winkelwagenmodel en voegt het product toe aan de winkelwagen. Gewoonlijk retourneert het winkelwagenmodel gegevens naar de controller over hoeveel producten er momenteel in de winkelwagen zitten, waarna de bijgewerkte winkelwagen met het nieuwe aantal producten in de View wordt weergegeven.
We zullen ons eigen framework gebruiken en de mogelijkheden uitbreiden op basis van MVC. Zoals eerder beschreven, worden gegevens gepresenteerd in modellen en opgeslagen in de database. De modellen en de tabellen in de database hebben dezelfde structuur (de velden in de modellen komen overeen met de velden in de tabellen). Daarom kunnen we ons MVC-diagram uitbreiden. We zien ook het eindresultaat dat wordt weergegeven in de View en in de browser verschijnt, dus voegen we dit ook toe aan het diagram.
Register (Registry)
Het register biedt de mogelijkheid om een verzameling objecten van ons framework op te slaan. De noodzaak van een Register ontstaat door de abstractie die samenhangt met het MVC-patroon. Elke controller en elk model (zoals product, winkelwagen, pagina) moet algemene taken kunnen uitvoeren, waaronder:
- Databaseverzoeken uitvoeren
- Controleren of de gebruiker is geautoriseerd om de gewenste informatie te verkrijgen
- Gegevens verzenden naar de View (beheer van templates)
- E-mails verzenden, bijvoorbeeld bij een aankoop op de site
- Werken met het bestandssysteem, bijvoorbeeld bij het uploaden van productafbeeldingen
De meeste systemen en frameworks voeren deze functies uit binnen objecten, en wij zullen dergelijke objecten aanmaken. Het Register maakt het mogelijk om deze objecten samen op te slaan. Het Register kan overal in het framework worden aangeroepen en biedt toegang tot zijn functies. Hieronder zie je een voorbeeldschema van ons Register.
Het framework communiceert rechtstreeks met het Register wanneer toegang tot bepaalde objecten nodig is. Binnen het Register kunnen objecten ook met elkaar communiceren; bijvoorbeeld de templatebeheerder kan gekoppeld zijn aan de bestandsbeheerder, en de e-mailzender kan verbonden zijn met e-mailsjablonen.
Singleton (Enkelvoudige klasse)
In het Russisch is het moeilijk om een directe vertaling voor “singleton” te vinden, daarom noemen we het een Enkelvoudige klasse. In documentatie wordt meestal de Engelse term “singleton” gebruikt. We zullen echter de benaming Enkelvoudige klasse hanteren.
De Enkelvoudige klasse is een van de eenvoudigste patronen om te begrijpen. Het belangrijkste doel is om te garanderen dat er slechts één instantie van een klasse bestaat. De reden hiervoor is meestal dat er maar één object van een bepaalde klasse nodig is, en dat dit object overal in de applicatie beschikbaar moet zijn — dus een globale toegang.
De Enkelvoudige klasse wordt gebruikt wanneer een klasse slechts één specifieke functie heeft. Bijvoorbeeld om een verbinding met de database op te zetten zodat andere objecten ermee kunnen communiceren.
Algemene structuur
De volgende stap in de ontwikkeling van ons framework is het plannen van de structuur. We moeten een structuur creëren voor:
- Modellen
- Views (zodat we de mogelijkheid kunnen integreren om stijlen van de site in ons framework te wisselen, met een aparte map voor elke stijl)
- Controllers (zodat we controllers in een aparte map kunnen bewaren, en bij het toevoegen van functionaliteit alleen een nieuwe map hoeven toe te voegen)
- Admin-controller (we bouwen niet alleen een framework, maar ook een CMS, dus we moeten voorzien dat moderators en beheerders inhoud op de site kunnen invoeren)
- Register
- Registerobjecten
- Uploads
- Externe bibliotheken
- Overige code
Gezien de structuur van het framework, moeten de mappen van ons framework er als volgt uitzien (we gebruiken Engelse namen, omdat dat gebruikelijk is in PHP):
- Models
- Views
- View A
- Templates
- Images
- JavaScript
- Controllers
- Controller A
- ControllerA
- ControllerAAdmin
- Controller A
- Registry
- Objects
- Database objects
- Assets
- Uploads
- Wordt uitgebreid wanneer we producten en afbeeldingen toevoegen aan ons framework!
- Libraries
- Miscellaneous