Hoi developers,
Ik heb een library gemaakt waarmee je plugins kunt maken voor je eigen systeem.
Hij is te vinden op Xesau/Plugins
.
Hoe gebruik je deze library?
- Eerst moet je een PluginManager maken. Daar geef je aan waar de plugins staan. Met
->loadPlugins()
kun je de plugins laden
// Maak een PluginManager en stel het pad in waar de plugin-bestanden te vinden zijn.
$plugins= new Xesau\Plugins\PluginManager('/map/naar/plugins');
$plugins->loadPlugins();
- Zoek een plek in je code waar je vindt dat een plugin iets aan moet kunnen passen.
In mijn geval is het bij het laten zien van de velden op een profiel.
foreach([
'gebruikersnaam' => $user->username,
'punten' => $user->points,
'status' => $user->status
] as $fieldName => $value) {
echo '<b>'. htmlentities(ucfirst($fieldName)) .'</b>: '. htmlentities($value) .'<br />';
}
- Maak een Event (class die [codeline]Event[/codeline] implementeert) voor de plugins om naar te "luisteren".
<?php
class ShowProfileFieldsEvent implements Event {
private $fields = [];
private $user;
public function __construct(User $user) {
$this->user = $user;
}
/**
* Krijg het User-object waar het event voor is.
* @return User
*/
public function getUser() {
return $this->user;
}
/**
* Krijg de naam van het event
* (verplicht bij Event-interface)
* @return string
*/
public function getName() {
return 'profile.show-fields';
}
/**
* Voeg een veld toe
*
* @param string $field De veldnaam
* @param string $value De veldwaarde
*/
public function addField($field, $value) {
$this->fields[(string)$field] = $value;
}
/**
* Krijg de ingestelde velden
* @return mixed[string]
*/
public function getFields() {
return $this->fields;
}
}
3. Pas de code zo aan dat er het event uitgevoerd wordt en dat er iets met het resultaat (in dit geval ->getFields()
van het event gebeurt.
// Maak het event aan en geeft $user mee
$event = new ShowProfileFieldsEvent($user);
// Voer het event uit via de PluginManager
$plugins->call($event);
// Stel de velden van het systeem zelf in.
$fields = [
'gebruikersnaam' => $user->username,
'punten' => $user->points,
'status' => $user->status
];
// Voeg de velden van het systeem en de velden van de plugins bij elkaar met array_merge
$fieldsCombined = array_merge($fields, $event->getFields());
// Laat voor elk veld de waarde zien in het formaat <b>Veld</b>: waarde
foreach($fieldsCombined as $fieldName => $value) {
echo '<b>'. htmlentities(ucfirst($fieldName)) .'</b>: '. htmlentities($value) .'<br />';
}
- Maak een testplugin om te kijken of het werkt, en stop deze plugin in de map waar je je bij (1) hebt aangegeven dat de plugins staan.
Als goede gewoonte kun je pluginbestanden als [codeline]Auteur.Pluginnaam.php[/codeline] opslaan. Dit bestand zou dus [codeline]Xesau.TestPlugin.php[/codeline] heten.
// Registreer de plugin in de PluginManager ($this)
$this->createPlugin('Xesau', 'TestPlugin', 'v1');
// Registreer een 'Event Listener'
$this->listen('profile.show-fields', function(ShowProfileFieldsEvent $e) {
$user = $e->getUser();
// Voeg het veld "leeftijd" toe met de als waarde het aantal jaren verstreken sinds de geboorde van $user
$e->addField('leeftijd', floor((time() - $user->timestamp_birthday) / 31536000));
});
Ik hoop dat jullie wat aan deze library hebben.
Groetjes,
@Xesau