[oop] mapper

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Technical Asset Specialist Substations

TenneT is growing fast to realize its strategic ambitions. We play a leading role in driving the energy transition. We are looking for a passionate Technical Asset Specialist for substations (onshore and offshore) at our location in Arnhem who will contribute to this and that might be you? Your contribution to TenneT We are searching for a motivated and engaged colleague as a technical asset specialist (onshore and offshore) for instrument transformers and surge arresters, with preferably a strong background in the area of insulation coordination. As a specialist for insulation coordination you are responsible for overarching topics regarding insultation

Bekijk vacature »

PHP Developer

Dit ga je doen Je werkt nauw samen met het websitebureau aan de ontwikkeling en optimalisering van het internationale platform; Je ziet nieuwe webshops op en voert optimalisaties door; Je bouwt aan technische, functioneel en commercial resultaat; Je vindt het leuk om zelfstandig binnen een internationale organisatie te werken, maar krijgt ook energie om samen met collega's te werken. Hier ga je werken Voor een bedrijf in de regio Rotterdam zijn wij opzoek naar een PHP Developer. Je wordt onderdeel van het communicatieteam en gaat je bezighouden met het optimaliseren van de website van dit internationale bedrijf. Je schakelt veel

Bekijk vacature »

Junior Front end developer

Functie Als Front end developer binnen onze organisatie ga jij je bezig houden met het bouwen van de user experience van de webapplicaties. Je bent verantwoordelijk voor het vertalen van concepten, briefings en designs naar werkende functionaliteit. Hierbij zorg je ervoor dat applicaties betrouwbaar, veilig en toekomstbestendig zijn en een goede architectuur hebben en behouden. Verder denk je actief na- en mee over nieuwe ontwikkelingen en functionaliteiten om zo elke dag de klantervaring weer te verbeteren. Dit doe je natuurlijk niet alleen maar in een development team. Het team bedraagt momenteel 4 man bestaande uit 2 devops engineers en 2

Bekijk vacature »

Java Front-end Developer

Dit ga je doen Ontwikkelen van nieuwe functionaliteiten in Java met tools als Springboot, MS SQL Server (T-SQL) en JavaScript; Het onderhouden van de (web-)applicaties binnen een complexe omgeving; Werken aan de migratie van een monolithisch systeem naar een architectuur gebaseerd op Kubernetes; Code reviews met collega's en actieve kennisuitdelingsessies voeren; Het uitvoeren van unit- en systeemtests Experimenteren met nieuwe tools en technieken. Hier ga je werken Binnen deze organisatie kom je te werken op de afdeling die gegevens verzamelt vanuit het hele land. Denk hierbij aan vertrouwelijke persoonsgegevens. Het team verwerkt al deze data met als doel het waarborgen

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

Bekijk vacature »

Senior Fullstack Developer (GOLang, TypeScript)

Bedrijfsomschrijving Our client is one of the large worldwide accounting firms. Functieomschrijving We are looking for a senior (all-round) developer (Project On Demand / Tax Technology) Uses as much as possible technology in support of the development process: Git, Jenkins, Docker, npm, skaffold, helm, etc. We are looking for a real hands-on developer; ie not a team lead or other managerial-style role; Acts with integrity both internally and externally and takes personal responsibility in this respect; Curious about the developments within their field and driven to make a difference with the team; Able to empathize with colleagues and stakeholders and

Bekijk vacature »

Applicatie ontwikkelaar

Functie omschrijving Zelfstandige applicatie ontwikkelaar gezocht voor familiair bedrijf in omgeving Capelle ad Ijssel Ben jij op zoek naar een nieuwe uitdaging en zoek jij een informele werkgever waar je zelfstandig kunt werken binnen een leuk IT team, lees dan snel verder want wie weet zijn wij op zoek naar jou! Een deel van jouw werkzaamheden: Onderhouden en ontwikkelen van de IT systemen; Opzetten van Azure Cloud systemen, denk aan interfaces, hardware op de Cloud, webportalen of BI functies; Werken aan scripts binnen verschillende software applicaties, denk aan ERP en CAD; Ontwikkelen en implementeren van MS PowerApps en Power BI.

Bekijk vacature »

Medior/senior Back-end developer gezocht!

Functie Vanwege de groei binnen het bedrijf zijn we op zoek naar versterking in het devlopmenttean. Als back-end developer bouw je aan de bedrijfssoftware die ons helpt bij de primaire processen. Een leuk (intern) project dus waarbij je de software continu doorontwikkeld! Je werkt in een klein team, we hebben dagelijks stand-ups en iedere twee weken een scrum-sessie, begeleid door onze Scrum Master. Hierin krijg je uitgebreid de kans om je ideeën te presenteren, en te overleggen met je mede-ontwikkelaars en de Product Owner. Binnen de ontwikkelteams gebruiken we Trello, Gitlab, Jiira, Confluence en Boockstack. Hiernaast werken ze met de

Bekijk vacature »

Front-end developer (Vue.js) gezocht!

Functie Als Front-end developer is het jouw doel om efficiënte en effectieve frontend code te ontwerpen, ontwikkelen en onderhouden die goed aansluit bij de functionele behoefte vanuit de klant. Je zorgt voor optimale SEO-resultaten, sitespeed en frontend security. You build it, you run it, you own it! Je maakt deel uit van een DevOps Scrum team en werkt samen met back-end developers, test-engineers, interaction designers en een projectmanager. Er zijn verschillende groepen Scrum teams. Een roadmap team is jouw ‘’thuisbasis’’, daar wordt gewerkt aan doorontwikkeling van bestaande omgevingen voor een aantal klanten. Hiernaast zijn er projectteams waar nieuwe omgevingen worden

Bekijk vacature »

Account Developer

Voor Bol.com zijn wij per direct op zoek naar een Account Developer voor 32-40 uur per week op het kantoor in Utrecht. Wil jij een directe bijdrage leveren door partners van de juiste data-inzichten te voorzien en via campagnes op nieuwe platformkansen en features te wijzen? Ben jij analytisch sterk en kun jij dit vertalen naar plannen en inspirerende gesprekken? Lees dan snel verder! wat bieden wij jou Salaris van €2400 - €2600 obv 40 uur Minimaal 6 maanden Werklocatie is Utrecht Werken bij bol.com wie ben jij Jij bent commercieel gedreven en weet altijd aan de juiste knoppen te

Bekijk vacature »

Full stack Javascript ontwikkelaar

Functie Benieuwd hoe jouw dag eruit ziet? Je komt binnen rond een uur of 10 en dat start je met de morning call. Dit doen we vanaf het hoofdkantoor of op het lab, ligt eraan welk project je mee bezig bent. Na de call en het verdelen van de tickets ga je met je team aan de slag. Rond een uur of 12 is er een goede lunch en ga je smiddags weer lekker door met je werk. De ene keer maak jij een game voor een groot merk om de interactie tussen product en eindgebruiker te vergroten. De andere

Bekijk vacature »

Oracle APEX developer

Wat je gaat doen: Als Oracle APEX ontwikkelaar bij DPA werk je samen met collega’s aan de meest interessante opdrachten. Je zult je ervaring met SQL, PL/SQL, JavaScript, HTML en CSS inzetten om wensen van opdrachtgevers te vertalen naar technische oplossingen. Je werk is heel afwisselend, omdat DPA zich niet beperkt tot een specifieke branche. Zo ben je de ene keer bezig binnen de zorgsector, de andere keer is dit bij de overheid. Wat we vragen: Klinkt goed? Voor deze functie breng je het volgende mee: Je hebt een hbo- of universitaire opleiding afgerond Je hebt 2 tot 5 jaar

Bekijk vacature »

Software Ontwikkelaar .NET te Zaandam

Bedrijfsomschrijving Je komt hier terecht bij een door-en-door softwarebedrijf, waarbinnen meerdere SaaS pakketten worden ontwikkelt voor diverse sectoren. Hierbij kun je denken aan bijvoorbeeld de logistieke en medische branche. Deze organisatie kenmerkt zich door de hoge mate van complexiteit in de applicaties, wat betekent dat jij je hier niet zal gaan vervelen. Integendeel: Jij gaat hier elke dag ontzettend veel leren en je in razend tempo ontwikkelen als C# .Net Developer met focus op back-end. Het team bestaat uit ongeveer 20 personen personen, waarvan het grootste deel zich richt op software development. De sfeer is informeel en professioneel. De producten

Bekijk vacature »

Embedded Software Developer

Functie omschrijving Voor een mooi softwarebedrijf in omgeving Moordrecht zijn wij op zoek naar een Embedded Software developer. Ben jij enthousiast en een echte team player? Lees dan snel of dit iets voor jou is! Binnen deze rol houdt jij je bezig met alle werkzaamheden die nodig zijn om een functionaliteit te bouwen. Denk aan ontwerpen, architectuur, programmeren en algoritmes. Je voert test en validatie werkzaamheden uit bij de implementatie bij de klant. Ben jij een Embedded Software Developer die affiniteit heeft met de allernieuwste technieken? Laat dan snel wat van je horen! Bedrijfsprofiel Onze opdrachtgever bestaat uit een groot

Bekijk vacature »

Database Developer

Functieomschrijving Wat ga je doen? Als developer ben jij samen met een gemotiveerd team van 10 collega’s verantwoordelijk voor het creëren van aangemeten software voor klanten. Je bent klantvriendelijk en oplossingsgericht ingesteld, omdat het essentieel is om de klanten zo goed mogelijk te helpen met hun uitdagingen. Het is mogelijk om vanuit huis je werkzaamheden uit te voeren, maar het is ook prettig als je in de omgeving van Tilburg woont om naar het kantoor te kunnen komen. Vind jij het leuk om jouw creatieve vaardigheden te benutten om complexe systemen te ontwikkelen? Lees dan snel verder! Bedrijfsprofiel Voor wie

Bekijk vacature »
Ozzie PHP

Ozzie PHP

05/05/2013 02:11:25
Quote Anchor link
Ola,

Kan iemand me uitleggen waartoe een mapper dient? Mijn gedachte (maar ik weet dus niet of dit 100% klopt) is dat een mapper een tussenlaag is tussen een class en een opslagmedium (meestal een database). In plaats van dat je in een class een "save" method hebt die rechtstreeks de database aanspreekt en een query uitvoert, spreek je de mapper aan. Klopt dit?

In een ander topic kwam toevallig dit stukje code voorbij:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$userMapper
= new UserMapper();
$user = $userMapper->getById(new User(12));
?>

Hier zie ik dus dat er een UserMapper wordt aangemaakt en dat er via die UserMapper een User object wordt teruggegeven.

Zou het niet handiger zijn om gewoon een nieuwe User aan te maken, en dat de User class intern een UserMapper gebruikt om de juiste databasegegevens te laden? Of kan dat niet?

En als je dan een User wil opslaan, moet je dat dan ook weer via die UserMapper doen?

Kortom, mijn vraag is eigenlijk hoe zo'n mapper werkt. Misschien kan iemand een heel simpel voorbeeldje geven van hoe je met een mapper een User moet laden en opslaan?
 
PHP hulp

PHP hulp

29/03/2024 09:31:27
 

05/05/2013 15:32:54
Quote Anchor link
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<?php

/**
 * Valideren van velden is weg gelaten!
 */

class User {

    private $id;
    private $username;

    /**
     * Alleen de id opslaan als dit ook een echte id is, want de mapper zal
     * dit aanroepen en dan zal de id niet correct opgeslagen worden.
     */

    public function __construct($id = 0) {
        (int)
$id != 0 ? $this->setId($id) : false;
    }


    public function setId($id) {
        $this->id = $id;
    }


    public function setUsername($username) {
        $this->username = $username;
    }


    public function getId() {
        return $this->id;
    }


    public function getUsername() {
        return $this->username;
    }

}


class UserMapper extends DataMapper {

    /**
     * @param object $user
     */

    public function getById(User $user) {
        $sth = $this->pdo->prepare('SELECT {velden} FROM users WHERE id = :id');
        $sth->execute(array(':id' => $user->getId());
        return $sth->fetchObject('User');
    }


    /**
     * @param object $user
     */

    public function save(User $user) {
        $sth = $this->pdo->prepare('UPDATE users SET username = :username WHERE id = :id');
        return $sth->execute(array(':id' => $user->getId(), ':username' => $user->getUsername()));
    }

}


/**
 * De user mapper openen.
 */

$userMapper = new UserMapper();

/**
 * De gebruiker met id 12 laden.
 */

print_r($userMapper->getById(new User(12));

/**
 * De gebruiker credentials toevoegen.
 */

$user = new User(12);
$user->setUsername('Aaron');

$userMapper->save($user);

?>

Het idee erond is dat een User object gebruikt wordt voor het vasthouden van de velden en de mapper dan weer de velden gaat afhandelen in de database.

Zo hebben de verschillende classes maar één taak.

Het is ook gemakkelijker als je de mappers moet updaten om de een of de andere reden.
Gewijzigd op 05/05/2013 15:36:05 door
 
Ozzie PHP

Ozzie PHP

05/05/2013 15:40:14
Quote Anchor link
Dankjewel voor je reactie Aaron.

Ik snap alleen nog niet helemaal hoe het werkt. Want als ik een user wil ophalen dan doe ik dit??

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$userMapper
= new UserMapper();
$user = $userMapper->getById(new User(12));
?>

Ik geef dan het User object mee aan de mapper? Correct? Alleen in jouw voorbeeld wordt de ID niet via de constructor geset. Of mis ik iets?

En wat gebeurt hier precies?

return $sth->fetchObject('User');

En hoe komt de data uit de database dan weer in die User class terecht?

Ik hoop dat je het nog een beetje kan toelichten!
 

05/05/2013 15:46:36
Quote Anchor link
Als je een gebruiker wilt ophalen moet je de mapper weer openen. Eventueel kun je een factory() functie maken... Om iets uit de database te halen geef je inderdaad een User object mee! Zo kan er niets van foute code tussen glippen als je alles uiteraard valideert.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php

function getUsername() {
    return preg_replace('![^a-zA-Z]!', '', $this->username);
}


?>

Met fetch object laat je het resultaat dus fetchen in een object. Wat heel gemakkelijk is omdat je dan weeral niets fout kan doen (zie getUsername()). Als je meerdere resultaten hebt gebruik je dan fetchAll(PDO::FETCH_CLASS, 'User').

fetchObject en fetchAll hebben toegang tot de private values dacht ik. Dit wordt tevens afgehandeld door PDO. In andere gevallen zou je gewoon een array terug geven.

Construct is nu toegevoegd.
 
Ozzie PHP

Ozzie PHP

05/05/2013 15:57:23
Quote Anchor link
Pfff, lastig. Ik dacht eigenlijk dat fetchObject alleen een stdObject kon teruggeven.

Zou je als laatste nog kunnen uitleggen hoe dat fetchObject werkt. Als ik hier kijk http://php.net/manual/en/pdostatement.fetchobject.php dan lijkt het alsof je nog een array met argumenten moet toevoegen, die vervolgens in de constructor wordt geinjecteerd.

En waarom geef je in de mapper het User object mee, terwijl je via fetchObject weer een User obejct teruggeeft?

Sorry voor de vele vragen, maar het is me (zoals je merkt) nog niet helemaal duidelijk wat er nou precies gebeurt.
 

05/05/2013 16:12:54
Quote Anchor link
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
<?php

/**
 * mixed PDOStatement::fetchObject ([ string $class_name = "stdClass" [, array $ctor_args ]] )
 */

$user = $sth->fetchObject('User');

/**
 * Dan zul je gewoon het volgende kunnen doen als er natuurlijk een
 * gebruiker is.
 *
 * De argumenten die je aan fetchObject kun meegeven heb ik nog nooit gebruikt. Maar
 * je moet er wel voor zorgen als je een constructor gebruikt dat je ervoor zorgt dat je
 * geen argument toelaat die niet valid zijn omdat anders fetchObject de constructor aanroept en
 * zo bijvoorbeeld id 'Aaron' wordt.
 */

echo $user->getUsername();

?>

Waarom ik aan de mapper een object mee geef.
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
29
30
31
32
33
34
35
36
37
38
39
<?php

/**
 * $_GET['id'] = 'Een String?';
 *
 * Laten we veronderstellen dat $_GET['id'] bestaat. Hier
 * zullen we $_GET['id'] dus nog moeten valideren. Daarom dat ik dus
 * user gebruik.
 */

$userMapper = new UserMapper();
$user = $userMapper->getById($_GET['id']);

/**
 * Laten we nu maar eens User gebruiken. Hier hoef je
 * niet te doen omdat $user->getId() ervoor zou moeten zorgen
 * dat je een id terug krijg of toch minstens een nummer (al dan niet correct).
 *
 * Ook naar de insert en save toe is het gewoon veel veiliger omdat alle input
 * dan gevalideerd is...
 *
 * De validatie is weg gelaten.
 */

$userMapper = new UserMapper();
$user = $userMapper->getById(new User($_GET['id']));

/**
 * In het eerste geval zal de query dan de volgende zijn.
 * SELECT {velden} FROM users WHERE id = 'Een String?'
 */

/**
 * In het tweede geval.
 * SELECT {velden} FROM users WHERE id = '0' of SELECT {velden} FROM users WHERE id = ''
 *
 * Die of is gewoon te zien hoe je de input valideert. Ik gebruik voor een int typecasting en dan
 * als het 0 is niets returnen.
 */


?>

En waarom ik een object terug geef is net dezelfde reden zoals hierboven. Dan wordt alle input nogmaals gecontroleerd, want neem nu aan dat er toch iets verkeerd in de database is opgeslagen... zal het nog altijd min of meer correct op het scherm komen (toch niet dat het gevaarlijk is voor de klant).
Gewijzigd op 05/05/2013 16:17:41 door
 
Ozzie PHP

Ozzie PHP

05/05/2013 16:25:36
Quote Anchor link
Ah, dus als ik het goed begrijp geef je een User object mee aan de Usermapper om te controleren of de ID wel een getal is. Maar dat betekent dus dat je eigenlijk voor niks een object aanmaakt.

Je zou ook gewoon een errormelding kunnen geven als $_GET['id'] geen getal is? Ik vind het vreemd dat je dan een User object meegeeft alleen om een getalletje te controleren.

Anyhow... dat fetchObject snap ik nog steeds niet. Jij doet dit:
$user = $sth->fetchObject('User');

Maar hoe komen de gegevens dan in het object terecht?
 

05/05/2013 16:32:37
Quote Anchor link
Ja. Dat zou je inderdaad kunnen doen en dat doe ik ook. Maar daarvoor maak ik een user object aan tijdens een POST request. Dan controleer ik of het een getal is (met eventuele errors) en dan heb ik toch al een user object... dus waarom niet gewoon aan de mapper doorgeven? In sommige gevalen selecteer je ook op meer dan één getal, dan kan het wel degelijk nuttig zijn.

Hoe de gegevens er terug komen weet ik niet want dit wordt door PDO geregeld (anders zou je ook nooit aan private values kunnen en dat kan hier wel). Alleen moeten de kolom namen gelijk zijn aan die in het object. Dus als je een kolom id hebt, moet je ook ergens $this->id hebben.

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
29
30
<?php

/**
 * In de veronderstelling dat alle POST en GET values bestaan!
 */

$user = new User($_GET['id']);
$userMapper = new UserMapper();

if($userMapper->getById($user) == false) {
    # Afhandelen
}

/**
 * Form submit.
 */

if($_SERVER['REQUEST_METHOD'] === 'POST') {

    $user->setUsername($_POST['username']);

    # Hier tussen nog alles valideren :-) Met een try catch block.

    $userMapper->save($user);

}


/**
 * Formulier tonen dat ook $user->get() gebruikt.
 */


?>

Zoals je kunt zien heb je dan toch al een object met alle veilige values!
Gewijzigd op 05/05/2013 16:34:07 door
 
Ozzie PHP

Ozzie PHP

05/05/2013 16:36:28
Quote Anchor link
Oké Aaron, thanks voor je uitleg!

Mochten er anderen zijn die ook gebruik maken van mappers, dan ben ik benieuwd naar hoe zij dat doen.

Alle reacties zijn van harte welkom!
 
Wouter J

Wouter J

05/05/2013 19:55:27
Quote Anchor link
Hmm... http://www.phphulp.nl/php/forum/topic/databse-in-een-class-hoe/82977/ (wat zou het toch makkelijk zijn als je al je eigen topics kan terugvinden...)
 
Tim S

Tim S

05/05/2013 20:14:12
Quote Anchor link
Ik heb het ook zonder mappers geprobeerd, maar vindt met mapper toch het prettigst werken.

Ik gebruik alleen geen fetchObject, wat ik wel eens doe is mappers in mappers gebruiken:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php

class menuMapper{

    public function fetchById($id){

        $smtp = $this->db->prepare('SELECT title, id FROM menus WHERE id=:id');
        $smtp->execute(array(
 
         ':id' => $id
 
        ));

         $result = $smtp->fetch(\PDO::FETCH_ASSOC);

        $menu = new \Menu;
         $menu->setId();
         $menu->setTitle();
 
         $itemMapper = new \menuItemMapper;
         $items = $itemMapper->fetchByMenuId($result['id']);
 
         $item = new \menuItem;
         foreach($items as $item){

             $item->setId();
              $item->setTitle();

              $menu->addItem(serialize($item));

         }
 

    }

}



$menuMapper = new menuMapper;
$menu = $menuMapper->fetchById(1);
print_r($menu->getItemsInArray());
?>
Gewijzigd op 05/05/2013 20:15:04 door Tim S
 
Ozzie PHP

Ozzie PHP

05/05/2013 21:15:43
Quote Anchor link
Thanks heren!

Wouter... dat zou inderdaad bijzonder makkelijk zijn. Hoe heb jij dat topic gevonden?
Op de een of andere manier kan ik regelmatig mijn topics niet meer terugvinden.
 
Wouter J

Wouter J

05/05/2013 21:19:41
Quote Anchor link
Ik zoek altijd via google en de volgende zoekopdracht: site:phphulp.nl %steekwoord% %username% Bij %username% vul ik dan altijd de naam in van de gene wie het geschreven heeft wat ik zoek. In dit geval was het: site:phphulp.nl datamapper usermapper pim wouter j
 
Ozzie PHP

Ozzie PHP

05/05/2013 21:46:03
Quote Anchor link
Ah oke... ik zoek me altijd rot en kan dan vaak niks meer terugvinden. En dan ga ik zelfs twijfelen of ik er uberhaupt al wel eens een vraag over heb gesteld. Jammer dat je via het forum zelf niet makkelijk iets kunt terugvinden.
 



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.