PHP hook maken (functie met callback functie)

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Bert Lodewijks

Bert Lodewijks

16/04/2021 00:38:27
Quote Anchor link
Hallo,


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$hooks
= array();

function
addHook( $hook, $func) {
    global $hooks;
    $hooks[$hook][] = $func;
}


 addToHead() {
    global $hooks;
    foreach($hooks as $hook => $functions){
        if ( $hook == 'head' ) {
            foreach($functions as $function){
                call_user_func( $function );
                $function();
            }
        }
    }
}

?>


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
 
PHP hulp

PHP hulp

13/05/2021 03:06:45
 
Thom nvt

Thom nvt

16/04/2021 07:58:51
Quote Anchor link
Op basis van jouw voorbeeld even een kort testje gemaakt en dat werkt voor mij gewoon?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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();
?>


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
 
Ad Fundum

Ad Fundum

16/04/2021 08:58:58
Quote Anchor link
Wordpress gebruikt PHP tags in HTML, waardoor de HTML een template wordt van een pagina. Als dat is wat je wilt, zit je goed. De volgorde van de website is iets lastiger te volgen nu je groepjes maakt van functies in een array, en die groepjes op allerlei verschillende plekken vult.

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.
 
Bert Lodewijks

Bert Lodewijks

16/04/2021 13:04:02
Quote Anchor link
Bedankt voor de reacties.

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.
 
Ad Fundum

Ad Fundum

16/04/2021 21:00:29
Quote Anchor link
Het is lastig om te zeggen wat handig is in jouw specifieke situatie, omdat de volgorde van de code nog weinig georganiseerd lijkt.

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.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.