Eenvoudig beheerbare configuratie in Symfony via KeyValueStorage

Eenvoudig beheerbare configuratie in Symfony via KeyValueStorage

Erik
Erik - 13 maart 2018
Fancycrave

Een goede eigenschap van programmacode is dat deze herbruikbaar is. Bij Zicht maken we "bundles" die we in verschillende projecten kunnen inzetten. Echter: de wens van de ene klant is niet altijd de wens van de andere klant. Om toch onze code te kunnen blijven gebruiken op verschillende plekken, hebben we de KeyValueStorage ontwikkeld. Deze bundle brengt niet alleen voordelen voor onze developers; ook voor de applicatiebeheerder geeft deze manier van configuratie nieuwe mogelijkheden.

In de categorie Symfony-based CMS bundles hebben we deze KeyValueStorage ontwikkeld voor het opslaan van data die door de gehele applicatie gebruikt kan worden. We kunnen hiermee getallen opslaan, maar ook teksten, afbeeldingen en keuzelijstjes vullen die gebaseerd zijn op dynamische content uit de database:

Screenshot KeyValueStorage in Symfony / Sonata

We dwingen bij het gebruik van deze bundle af dat elke nieuwe key vooraf gedefinieerd moet worden in de programmacode, en uniek is. Dit levert tijdens het programmeren de zekerheid op dat een key in alle gevallen aanwezig is. Daarbij is er voor elke key de mogelijkheid om op meerdere manieren te voorzien in een standaard waarde, én kan deze waarde dus overschreven worden via het CMS. De toepassing van deze bundle varieert van het kunnen instellen van eenvoudige waardes, tot vergaande dynamische configuratiemogelijkheden.

Scenario 1: Melding tonen bij bijna uitverkocht

Via onze software TicketTrigger verzorgen we voor diverse Nederlandse Eredivisieclubs de online kaartverkoop. Op al deze websites is er functionaliteit voor het tonen van een melding als een vak in het stadion bijna uitverkocht is. Om uiteenlopende redenen (marketing, logistiek) heeft elke club een eigen voorkeur voor het moment van het laten zien van deze melding. Door per voetbalclub een standaardwaarde te definiëren voor het weergeven (bijv. bij nog 10 beschikbare kaarten) kunnen we in onze programmacode een eenvoudige vergelijking maken waarbij we weten dat deze in alle gevallen een geldige uitkomst heeft. Daarbij heeft de club zelf de mogelijkheid om deze waarde aan te passen zodat zelfs per wedstrijd bepaald kan worden wat een nuttige waarde is.

Scenario 2: Herbruikbaarheid

Er is soms ook sprake van data die niet direct te herleiden is naar de content van 1 pagina, of die op meerdere plaatsen op de website nodig is. Een voorbeeld daarvan is het gebruik van video, waarbij we een koppeling hebben gemaakt met een gespecialiseerd videoplatform. Hier heeft onze opdrachtgever de mogelijkheid om zelf videoplayers te configureren. Denk daarbij aan het wel/niet weergeven van bepaalde buttons, afspelen met/zonder advertenties, pauzeren toestaan ja/nee, slechts eenmalig kunnen bekijken, alleen bekijken indien ingelogd, etc.

Deze videospeler gebruiken we door de hele website heen, zowel bij het afspelen van content die de gebruiker kan invoeren, als bij het afspelen van video's op vaste plekken. Door deze videospeler in de KeyValueStorage op te nemen kan deze overal gebruikt worden, en als de CMS-beheerder een nieuwe videospeler configureert, kan deze via het CMS op 1 plek worden bijgewerkt. Eenvoudig door de klant zelf te beheren, en het scheelt aanpassing in code door ons.

Kortom, de KeyValueStorage heeft flink wat voordelen t.o.v. traditionele of situatiespecifieke configuratie:

  • Eenvoudig standaardwaarden definiëren: in onze programmacode, eventueel overschreven per applicatie en/of in de database.
  • Keys aanpassen op een veilige manier in het CMS: met een eigen invoerveld en mogelijk specifieke validatieregels: de waarde mag niet leeg zijn, moet een getal zijn, moet een getal zijn van tenminste 6 cijfers, moet een url zijn die begint met https, moet een datum zijn in de toekomst, etc 
  • Kan ook gebruikt worden voor het aan- en uitzetten van functionaliteit.
  • Al het bovenstaande op een uniforme manier, daar waar voorheen diverse configuratiemethoden door elkaar werden gebruikt.

Het hart van de bundle (StorageManager) is nog geen 150 regels lang, en heeft unittests voor verschillende scenario's. Ook blijven we deze bundle doorontwikkelen, zo we hebben we afgelopen week bijvoorbeeld taalafhankelijkheid geïntroduceerd voor keys. 
En in het kader van onze open source policy, waarbij we zo veel mogelijk van onze generieke code vrijgeven, is deze bundle ook te vinden op Github.