login  Naam:   Wachtwoord: 
Registreer je!
 Forum

class/method overwrite (Opgelost)

Offline Wijnand - 09/11/2011 09:05
Avatar van WijnandModerator Ik loop op dit moment tegen iets aan, waarbij ik even wil vragen of jullie mee willen denken.

Ik ben bezig om een framework in elkaar te zetten. Ik heb allerlei ideeën verzameld en hij is nu in ontwikkeling.

Maar er zit één functionaliteit die wat hoofdpijn oplevert. Dat zijn plugins.

Ik heb in de controller bijvoorbeeld (is een voorbeeld, dus niet echt) een mail method. Die wordt in het hele framework gebruikt. Stel dat ik nu in een plugin deze method wil overschrijven, zodat de nieuwe method (plugin-method) wordt gebruikt in de hele website, hoe zouden jullie dat doen.

Dus:
  1. // dit is de controller
  2. class Controller {
  3. public function mail() {
  4. // code
  5. }
  6. }
  7.  
  8. // dit is de plugin-overwrite
  9. class Plugin_test {
  10. public function mail() {
  11. // code
  12. }
  13. }



Wat ik tot nu toe heb gedaan/bedacht/afgekeurd:
1. Een functie loadMethod($class,$method,$args) gemaakt die dit regelt. Maar dit vind ik niet mooi en handig. Je moet dan elke keer loadMethod gebruiken als je een method wil aanroepen van een core-class.
2. In de mail-method in controller de controle doen. En dan eventueel de plugin-code inladen in de method. Dit zorgt ervoor dat ik werk extra moet doen en grotere classes kan krijgen, en het is niet echt netjes.

Dus hebben mensen nog ideeën?

6 antwoorden

Gesponsorde links
Offline Ontani - 09/11/2011 10:33
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Je gaat die functie enkel kunnen overschrijven als je Plugin_test extend van Controller.
En al je method-calls dan naar Plugin_Test doen, niet naar Controller.
Offline Wijnand - 09/11/2011 10:39
Avatar van Wijnand Moderator Ja, maar ik wil in een plugin de controller-method overschrijven, zodat in het hele systeem (=framework) deze nieuwe method gebruikt wordt.
Offline Ontani - 09/11/2011 11:16 (laatste wijziging 09/11/2011 11:42)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Volgens mij is dit gewoon niet mogelijk omdat je in het hele systeem gewoon $this->mail(); doet. Of je moet je methods op een andere manier gaan aanroepen waarin de controller een variabele is. Maar zoals je zelf al aangaf was dit geen optie.

Edit: In Wordpress bestaat er iets als:

  1. register_replacement_function( 'some_function', 'new_fun' );
  2. function new_fun( $param ) {}


Misschien eens in de broncode kijken hoe ze dat doen.
kan zijn dat het gewoon via PHP.net: override_function doen.
Offline Wijnand - 10/11/2011 08:42
Avatar van Wijnand Moderator Ik heb er overna gedacht, ik denk dat ik hetgeen doe wat mimvic doet, namelijk de controller methods niet in een class proppen, maar in 'normale' functions (met een controle erop of ze al bestaan). Dan kun je in de bootstrap van een plugin aangeven welke functions core-functions moeten overriden en dit in de core-controller aangeven.
Offline Ontani - 10/11/2011 10:41
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Lijkt me inderdaad de meest gemakkelijke oplossing.

Net ook eens geprobeerd met PHP.net: override_function maar daar moet je PECL voor geinstalleerd hebben.
Bedankt door: Wijnand
Offline Wijnand - 10/11/2011 10:51 (laatste wijziging 10/11/2011 11:10)
Avatar van Wijnand Moderator Ik had het ook geprobeerd en liep tegen hetzelfde aan. Jammer, maar het heeft nu al ruim een week 'onderzoek' gekost, dus dan maar niet.

Bedankt in ieder geval voor het meedenken!
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.18s