PHP hook maken (functie met callback functie)
Om het mijzelf makkelijker te maken wil ik een hook bouwen met PHP. Ik ben al eraan begonnen maar krijg het nog niet goed werkend.
Wat is de bedoeling:
Als voorbeeld:
In de header van mijn website plaats ik de PHP functie head();
De output van deze functie is variable en ligt aan welke pagina is aangeroepen.
Ik weet dat bijvoorbeeld Wordpress gebruikt maakt van add_action die twee parameters kent para1: hook functie para2: de callback functie.
Zoiets had ik zelf ook in gedachte.
dit is wat ik tot nu toe heb
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Het bovenstaande heb ik in mijn core geplaatst maar aangezien deze eerder geladen word dan de rest werkt het bovenstaande niet.
Wat is jullie advies hierin?
Kort door de bocht ik zo ik wil een php functie met een callback die leid naar een andere functie en voor die uit.
Gewijzigd op 16/04/2021 00:38:45 door Bert Lodewijks
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
global $hooks;
$hooks = array();
function addHook( $hook, $func) {
global $hooks;
$hooks[$hook][] = $func;
}
function addToHead() {
global $hooks;
foreach($hooks as $hook => $functions){
if ( $hook == 'head' ) {
foreach($functions as $function){
call_user_func( $function );
}
}
}
}
function myHook() {
echo "Hook aangeroepen!";
}
addHook("head", "myHook");
addToHead();
?>
global $hooks;
$hooks = array();
function addHook( $hook, $func) {
global $hooks;
$hooks[$hook][] = $func;
}
function addToHead() {
global $hooks;
foreach($hooks as $hook => $functions){
if ( $hook == 'head' ) {
foreach($functions as $function){
call_user_func( $function );
}
}
}
}
function myHook() {
echo "Hook aangeroepen!";
}
addHook("head", "myHook");
addToHead();
?>
Wat bedoel je met "aangezien deze eerder geladen word dan de rest werkt het bovenstaande niet.". Wat word eerder ingeladen waardoor het niet werkt?
Overigens lijkt wat je probeert te bereiken behoorlijk op het Observer pattern.
PHP heeft daar built-ins voor als je met OOP werkt: https://refactoring.guru/design-patterns/observer/php/example#example-0
Als de uitvoer van de functies alleen bedoeld is voor een browser, is er een alternatief met DOMDocument en XPath. De PHP code kan daarmee rechtlijniger worden (met minder sprongen), en je vult de DOM op verschillende plekken vanuit XPath. Dat heeft mijn persoonlijke voorkeur, maar ik kan me voorstellen dat het niet voor iedere situatie handig is.
Ik zie dat ik iets ben vergeten in mijn vraagstelling.
De functies staan in mijn core file de functie addToHead roep ik aan in mijn header file.
De functie addHook roep ik ergens midden in aan.
De header file word eerder geladen dan de content files waardoor de addToHead functie een lege array heeft.
Misschien heb je wat aan deze meer gebruikte opzet:
Een enkel index.php script wordt via een url rewrite rule in de webserver gekozen als front controller waar alle browserverzoeken terecht komen. Vanuit de front controller kijk je naar de URL, om te weten welke code je moet uitvoeren. Dat kan met een router met hooks, maar je kunt ook met URL variabelen direct een PHP methode van een klasse aanroepen. Die klasse is idealiter een uitbreiding op een basisklasse die pagina onderdelen bij elkaar haalt, uit een database of anderszins.
Als je liever met hooks werkt moet je erg letten op de volgorde van de aangehaakte functies om de pagina correct op te bouwen, wat lastig is als ze 'ergens' in een midden staan.
Zelfbouw is de langste, meest leerzame (en wat mij betreft leukste) weg, die jaren kan duren. Als je sneller iets nodig hebt dat op een productie-omgeving draait ben je beter af door te werken met een bestaand raamwerk. Laravel komt vaak voorbij, Symfony is heel compleet, en er zijn er nog wel meer te vinden die de moeite waard zijn om te evalueren. Alleen al bekijken hoe het in een ander systeem werkt is leerzaam.
Al zou ik dan niet met Wordpress beginnen, dat is nogal spaghetti en weinig gestructureerd in de database, waardoor er zo weinig vanzelf spreekt dat ze voor Wordpress alleen een heuse codex hebben moeten ontwikkelen om er nog mee te kunnen werken. Vrijwaring: dat is mijn eigen persoonlijke bias, dus ergens op gebaseerd.